具有生命游戏功能的分割错误

时间:2015-05-31 03:01:27

标签: c segmentation-fault

我在这个功能中遇到了分段错误,我不明白为什么。我无法通过GDB隔离问题,它只是告诉我这是失败的功能,我只是想看看是否有人看到了一些错误。我正在尝试学习C并优化此功能。它是Conway生命游戏实现的细胞进化功能。

我在这个函数中调用另外两个函数来返回一个单元格的邻居数。该板是一个2d阵列,宽度和高度。

提前致谢。

这是功能:

void evolveCell(board prev, board next)
{
  int i, j, n, mask;
   int width = WIDTH;
   int height = HEIGHT;

 for (i=1; i < width-1; ++i) {
      for (j = 1; j < height-1; ++j) {
         n = _neighbors(prev, i, j);
         mask = (prev[i][j] << 1);
         next[i][j] = !(((n >> prev[i][j]) ^ 3) ^ mask);
      }
   }

   for (i = 0; i < width; i+= width-1) {
     prev[i][j] = prev[i][0];
     next[i][j] = next[i][0];
     for (j = 0; j < height; ++j) {
       n = neighbors(prev, i, j);
       mask = (prev[i][j] << 1);
       next[i][j] = !(((n >> prev[i][j]) ^ 3) ^ mask);
     }
   }
   for (j = 0; j < height; j += height-1) {
     prev[i][j] = prev[0][j];
     next[i][j] = next[0][j];
     for (i = 0; i < width; ++i) {
       n = neighbors(prev, i, j);
       mask = (prev[i][j] << 1);
       next[i][j] = !(((n >> prev[i][j]) ^ 3) ^ mask);
     }
   }

}

1 个答案:

答案 0 :(得分:4)

我怀疑你的行存在一些问题

 for (j = 0; j < height; j += height-1) {
     prev[i][j] = prev[0][j];

考虑前面的for循环,对于width = 3的值,我演变为0,2,4。当i变为4时,不使用for循环,但是i的值现在是4然后是下一个for循环,使用上面提到的一个,当你试图访问prev[4][0]时,可能会出现问题。

使用gdb - 你可以做一个回溯(bt),它可以准确地告诉你哪一行导致了问题。为此,建议您使用&#39; -g&#39;进行编译。选项(我假设是gcc)或参考编译器的手册来启用调试符号。这将告诉您导致问题的行,然后在您的gdb提示符上使用变量打印(p ip j),您将能够调试实际问题。

希望有所帮助