具有生命游戏功能的分段错误
segmentation fault with a game of life function
我在这个函数中遇到了分段错误,我不知道为什么。我无法隔离 GDB 的问题,它只是告诉我这是失败的功能,我只是想看看是否有人立即发现错误。我正在尝试学习 C 并优化此功能。它是康威生命游戏实现的细胞进化函数。
我在这个函数中调用了另外两个函数,return 一个单元格的邻居数。该板是一个二维数组,宽度和高度。
提前致谢。
函数如下:
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 提示符下使用变量打印 (p i
、p j
),您将能够调试实际问题。
希望对您有所帮助
我在这个函数中遇到了分段错误,我不知道为什么。我无法隔离 GDB 的问题,它只是告诉我这是失败的功能,我只是想看看是否有人立即发现错误。我正在尝试学习 C 并优化此功能。它是康威生命游戏实现的细胞进化函数。
我在这个函数中调用了另外两个函数,return 一个单元格的邻居数。该板是一个二维数组,宽度和高度。
提前致谢。
函数如下:
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 提示符下使用变量打印 (p i
、p j
),您将能够调试实际问题。
希望对您有所帮助