访问2D阵列中的超出边界单元格

时间:2015-10-23 15:28:56

标签: c arrays

在我的生活游戏中,我无法真正看到我的支票邻居功能出现了什么问题。它检查所有8个邻居,然后根据生活计数分配被检查的细胞生存或死亡,然后更新板。

void check_neighbours (int board[][COL])

{

int living = 0, i, j, k, l;
int new_board[ROW][COL];

for (i = 0; i < ROW; i++)
    {
    for (j = 0; j < COL; j++)
        {
        if ((board[i + 1 % ROW][j % COL]) == '#')
            {
                living++;
            }
        if ((board[i - 1 % ROW ][j % COL]) == '#')
            {
                living++;
            }
        if ((board[i % ROW][j + 1 % COL]) == '#')
            {
                living++;
            }
        if ((board[i % ROW][j - 1 % COL]) == '#')
            {
                living++;
            }
        if ((board[i + 1 % ROW][j + 1 % COL]) == '#')
            {
                living++;
            }
        if ((board[i - 1 % ROW ][j + 1 % COL ]) == '#')
            {
                living++;
            }
        if ((board[i + 1 % ROW ][j - 1 % COL ]) == '#')
            {
                living++;
            }
        if ((board[i - 1 % ROW ][j - 1 % COL ]) == '#')
            {
                living++;
            }
        if (living == 3)
            {
                new_board[i][j] = '#';
            }
        if (living <= 2)
            {
                new_board[i][j] = '-';
        if (living < 3)
            {
                new_board[i][j] = '-';
            }
        }
    }


for (k = 0; k < ROW; k++)                       
    {
    for (l = 0; l < COL; l++)                   
        {
            board[k][l] = new_board[k][l]; 
        }
    }      
}
}

编辑:添加括号但仍然打印相同的

3 个答案:

答案 0 :(得分:2)

尝试在数学中加入一些括号:

board[(i + 1) % ROW]

更安全
board[i + 1 % ROW]

答案 1 :(得分:1)

不是这样的:

board[i + 1 % ROW]

越界?尝试解决这些问题。

正如Paul R建议的那样,您可以使用括号,以便与%运算符相比,赶上+运算符的更高优先级。所以将代码更改为:

board[(i + 1) % ROW]

假设ROW = 5且i = 4,则得到:

  

(4 + 1)%5 = 0 //是啊!

     

4 + 1%5 = 5 //哦亲爱的......

答案 2 :(得分:1)

在执行living计数之前测试边缘条件。

for (i = 0; i < ROW; i++) {
    for (j = 0; j < COL; j++) {
      int living = 0;
      for (int drow = -1; drow <= 1; drow++) {
        int row = i+drow;
        if (row < 0 || row >= ROW) continue;  // over the edge
        for (int dcol = -1; dcol <= 1; dcol++) {
          int col = j+dcol; 
          if (col < 0 || col >= COL) continue;  // over the edge
          if (row==0 && col==0) continue;  
          if (board[row][col] == '#') {
            living++;
          }
        } // endfor dcol
      } // endfor drow

      // This section may need review - GOL rules are unclear in post -see below
      if (living == 3) {
        new_board[i][j] = '#';
      } 
      ...
    } // endfor j
  } // endfor i

如果遵守规则:

任何活着的邻居少于两个的活细胞都会死亡,就像人口不足一样 任何有两三个活邻居的活细胞都会留在下一代 任何有三个以上活着的邻居的活细胞都会死亡,就像人口过多一样 具有正好三个活邻居的任何死细胞变成活细胞,就好像通过繁殖一样。

     #define ALIVE ('#')
     #define DEAD  ('-')
     #define POP_MIN 2
     #define POP_MAX 3
     #define POP_REPRO 3

     new_board[i][j] = board[i][j];
     if (board[i][j] == ALIVE) {
       if (living < POP_MIN) new_board[i][j] = DEAD;
       else if (living > POP_MAX) new_board[i][j] = DEAD;
     } else {
       if (living == POP_REPRO) new_board[i][j] = ALIVE;
     }