-2

私は2D配列を持っています。8 行と 10 列すべてを反復処理し、for ループを使用して値を読み取ります。配列と出力は次のとおりです。

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 2 1 1 1 0 0 0 0 0 
0 0 0 1 2 1 2 2 1 2 1 2 1 0 0 0 
0 0 0 1 2 1 2 2 1 2 1 2 1 0 0 0 
0 0 0 1 2 1 2 2 1 2 1 2 1 0 0 0 
0 0 0 1 2 1 2 2 1 2 1 2 1 0 0 0 
0 0 0 1 2 1 2 2 1 2 1 2 1 0 0 0 
0 0 0 1 2 1 2 2 1 2 1 2 1 0 0 0 
0 0 0 1 2 1 2 2 1 2 1 2 1 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

empty row board[3][3] = 0 empty row board[3][4] = 1
empty row board[4][3] = 0 empty row board[4][4] = 2
empty row board[5][3] = 0 empty row board[5][4] = 1
empty row board[6][3] = 0 empty row board[6][4] = 2
empty row board[7][3] = 0 empty row board[7][4] = 2
empty row board[8][3] = 0 empty row board[8][4] = 1
empty row board[9][3] = 0 empty row board[9][4] = 2
empty row board[10][3] = 0 empty row board[10][4] = 1
empty row board[11][3] = 0 empty row board[11][4] = 2
empty row board[12][3] = 0 empty row board[12][4] = 1

実際の配列は、ゼロのバッファー (両側に少なくとも 3 つ) で囲まれています。行 =3 を読み取ろうとすると、要素は読み取られず、すべてゼロとして読み取られます。配列の下に、行 3 の要素と行 + 1 の要素 (つまり 4) を出力しました。行 4 からすべての要素を読み取ることができますが、行 3 からは何も読み取ることができません。なぜですか? 助けてください!!!

@Mat 投稿コード:

行が空かどうかを確認しようとしています。

int emptyRow(int row){
    int i, counter;
    counter = 0;

    for(i=3; i<=num_col+2; i++) {
        printf ("empty row board[%d][%d] = %d ", i, row, board[i][row]);
        printf ("empty row board[%d][%d] = %d\n", i, row+1, board[i][row+1]);
        if(board[i][row] == 1 || board[i][row] == 2 || board[i][row] == 3)
            counter++;
    }
    return counter;         /* Counter = 0 means its empty*/
}

渡される行は 3 で、カウンターは行の要素数をカウントします。num_col は列の数です。関数は、counter = 0 を返します。これは、行 3 が空であることを意味します。

ファイルから入力を読み取って出力しています。このコードは、私たちが取り組んでいる AI の一部であり、コードが複雑であるため、すべてのコードを投稿することはできません。プリント基板は以下に掲載されています。

行 3 は境界条件であるため、行 3 の上にあるものは気にしませんが、行 3 を適切に読み取る必要があります。

void print_board(){
    int i;
    int j;

    for(i=0;i< 16; i++){
        for(j=0;j<16;j++){
            printf("%d ", board[j][i]);
        }
        printf("\n");
    }
}
4

3 に答える 3

0

print_board()表示された出力が への呼び出しからのものであり、表示されたデバッグ出力がへの呼び出しからのものであると仮定すると、emptyRow(3)意味のある唯一の説明は、boardこれら 2 つの呼び出しの間で変更されたということです。ソフトウェアをチェックboardして、 の呼び出しに至るまでの各段階で期待する値が に含まれていることを確認しますemptyRow(3)

于 2013-06-13T08:10:01.340 に答える
0

これらの行を使用して、

    printf ("empty row board[%d][%d] = %d ", i, row, board[row][i]);
    printf ("empty row board[%d][%d] = %d\n", i, row+1, board[row+1][i]);
    if(board[row][i] == 1 || board[row][i] == 2 || board[row][i] == 3)

これは期待どおりに動作するはずです。行/列の混同に関する以前の回答を参照してください。これは、ボード配列が実際には 16 x 16 のサイズであり、num_col+2 が 12 と評価されることを前提としています。

gdb を使用してプログラムを実行すると、プリント ボード [3]、プリント ボード [4] などを使用して、プログラムが表示する内容を確認できます。

于 2013-06-13T08:06:06.337 に答える
-1

配列全体の最初のセットを行列として出力するコードで、行と列が入れ替わっています。

使用する

 void print_board(){
    int i;
    int j;

    for(i=0;i< 16; i++){
        for(j=0;j<16;j++){
            printf("%d ", board[i][j]);
        }
        printf("\n");
    }
}
于 2013-06-13T07:27:09.437 に答える