簡體   English   中英

帶有生活游戲功能的細分錯誤

[英]segmentation fault with a game of life function

我在此函數中出現分段錯誤,我也不知道為什么。 我無法用GDB隔離問題,它只是告訴我這是失敗的功能,我只是想看看是否有人立即發現錯誤。 我正在嘗試學習C並優化此功能。 它是Conway生命游戲的一種實現細胞進化的功能。

我在此函數中調用了另外兩個函數,這些函數返回單元格具有的鄰居數。 電路板是寬度和高度的二維陣列。

提前致謝。

這是函數:

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);
     }
   }

}

我懷疑您的電話線有問題

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

考慮上一個for循環,例如width =3。i演化為0、2、4。當i變為4時,不使用該for循環,但是i的值現在為4,然后是下一個for循環,使用了上面提到的一個,當您嘗試訪問prev[4][0] ,可能有問題。

使用gdb-您可以執行回溯(bt),確切地告訴您引起問題的行。 為此,建議您使用“ -g”選項進行編譯(我假設是gcc),或者參考您的編譯器手冊來啟用調試符號。 這將告訴您引起問題的那一行,然后在gdb提示符下使用可變打印( pipj ),您將能夠調試實際的問題。

希望能有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM