-2

我有一个二维数组。我正在迭代所有 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在这两个调用之间进行了修改。检查您的软件以确保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 运行程序,然后您可以使用 print board[3]、print board[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 回答