我正在用一个malloc'd数组实现康威的人生游戏,它是一个0和1的网格,任何地方用0我打印一个白色背景空间表示一个"死"单元格,任何地方用1我打印一个黑色背景空间表示一个"活"单元格.

我在更新每个周期的单元格时遇到了一些问题.我的方法是使用getState()函数,它只判断网格条目是0还是1,然后相应地返回一个值.我还有一个countN()函数,它遍历网格,计算数字——计算角、边和中心的情况.我已经用几个例子彻底测试了它们,它们按照我的预期工作,对于给定的网格坐标,它总是返回正确的状态&活动邻居的数量.

这就是我试图做的(伪代码):

void updateGrid(int **grid, int r, int c) {
    copyGrid = grid;
    for (i = 0; i < r; i++) 
        for (j = 0; j < c; j++) {
            alive->getState(grid, i, j) 
            neighbours->countN(grid, i, j)
          
            if (alive) {
                if (neighbour < 2 || neigbour > 3) 
                    copyGrid[i][j] = 0;
                else 
                    copyGrid[i][j] = 1;
            } else {
                if (neighbour == 3) 
                    copyGrid[i][j] = 1;
                else 
                    copyGrid[i][j] = 0; 
            }
        }
    grid = copyGrid; 
    printGrid(grid, r, c)
}

有一个简单的调用函数,它只是从输入文件中生成一个初始网格,清除屏幕,然后调用updateGrid(),并在每个周期后Hibernate ,直到一定数量的周期.初始网格是我所期望的,相邻函数和活动函数返回正确的值,但网格更新不正确,输出非常扭曲.

例如,使用1和0:

Input:    Expected Output:     Actual Output
0 0 0     0 1 0                0 1 1 
1 1 1     0 1 0                1 0 1 
0 0 0     0 1 0                0 0 0 

任何提示都将不胜感激!

推荐答案

将网格副本复制回grid的方法不起作用:copyGrid = grid;grid = copyGrid;不起作用,第一个覆盖全局指针copyGrid,这会导致更新的单元格写入原始网格,第二个不起作用,因为两个指针都已指向同一区域.

您必须删除copyGrid = grid;语句.所有更新的单元格都会计算并存储到copyGrid中,因此无需复制原始单元格.计算完新一代后,必须将其复制回原始grid:假设copyGrid具有与grid相同的几何图形,即r个指针的数组指向c个整数的数组,则必须使用循环来复制此间接2Darray.

另一种方法是使用2个全局数组,在计算每一代后交换指针.

以下是修改后的版本:

int **copyGrid;  // assuming this pointer points to an allocated grid

void updateGrid(int **grid, int r, int c) {
    // compute the new grid value in copyGrid
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            int alive = getState(grid, i, j); 
            int neighbours = countN(grid, i, j);
            if (alive) {
                if (neighbours < 2 || neighbours > 3) 
                    copyGrid[i][j] = 0;
                else 
                    copyGrid[i][j] = 1;
            } else {
                if (neighbour == 3) 
                    copyGrid[i][j] = 1;
                else 
                    copyGrid[i][j] = 0; 
            }
        }
    }
    // copy the new grid value from copyGrid back to grid
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            grid[i][j] = copyGrid[i][j];
        }
    }
    printGrid(grid, r, c);
}

C++相关问答推荐

为什么macOS上的FIFA管道比匿名管道慢8倍?

理解没有返回语句的递归C函数的行为

为什么我得到更多的256假阳性在PKZIP解密密钥验证?

括号中的堆栈实现错误问题

堆栈帧和值指针

如何一次获取一个字符

这是一个合法的C Strdup函数吗?

为什么我的Hello World EFI程序构建不正确?

S在本文中的价值观到底出了什么问题?

如何在C++中安全地进行浮点运算

为什么我的二叉树删除删除整个左部分的树?

变量值不正确的问题

为什么一个在线编译器拒绝这个VLA代码,而本地的Apple clang却不拒绝;t?

C程序printf在getchar while循环后不工作

在C中,为什么这个带有递增整数的main函数从不因溢出而崩溃?

If语句默认为true

struct 中的qsort,但排序后的 struct 很乱

使用 c 中的 write() 函数将非 ASCII 字符写入标准输出

GnuCobol 使用 double 类型的参数调用 C 函数

如何为avr atmega32微控制器构建C代码,通过光电二极管捕获光强度并通过串行通信传输数据