康威的生命游戏问题更新板

时间:2014-10-29 22:11:34

标签: c arrays pointers

所以我正在为学校开发assignmmnet,其中包括在汇编中编写此更新函数以使用提供给我们的C代码。它只是Conway生命游戏的一个简单版本,它生成一个随机的电路板配置,然后根据规则用新值更新它。我想我会先用C编写函数,所以我知道在汇编时要做什么。我遇到了一些困难,我认为这些困难源于没有完全理解双指针在C中是如何工作的。有些地方在给我们的代码中,生命游戏的董事会使用像这样的malloc调用来初始化:

int **board;
board = malloc(sizeof(int *) * height);
for(i = 0; i < height; i++){
    board[i] = malloc(sizeof(int) * width);
}

每个细胞如果活着则给予1或者如果它死了则为0。

现在我们应该写的更新函数将** board作为参数。我只使用常规二维数组,但如果我正确理解它,那么双指针的行为应该类似于二维数组。无论如何,这里是我写的c代码:

void update(int **board, int width, int height)
{
int neighborCount = 0; //keeps count of live neighbors
int row = 0;
int col;

int tempBoard[height][width]; //holds updated board temporarily

for(; row < height; row++)
{
    col = 0;

    for(; col < width ; col++)
    {
        //If tests to check if out of bounds.  If not than adds value of cell
        //to neighbor count.  Continues for each possible neighbor
        if ((row - 1) >= 0 && (col - 1) >= 0)
        {
            neighborCount = neighborCount + board[row - 1][col - 1];
        }
        if ((row - 1) >= 0)
        {
            neighborCount = neighborCount + board[row - 1][col];
        }
        if ((row - 1) >= 0 && (col + 1) < width)
        {
            neighborCount = neighborCount + board[row - 1][col + 1];
        }
        if ((col - 1) >= 0)
        {
            neighborCount = neighborCount + board[row][col - 1];
        }
        if ((col + 1) < width)
        {
            neighborCount = neighborCount + board[row][col + 1];
        }
        if ((row + 1) < height && (col - 1) >= 0)
        {
            neighborCount = neighborCount + board[row + 1][col - 1];
        }
        if ((row + 1) < height)
        {
            neighborCount = neighborCount + board[row + 1][col];
        }
        if ((row + 1) < height && (col + 1) < width)
        {
            neighborCount = neighborCount + board[row + 1][col + 1];
        }

        //save new value in temp board based on neighbor count
        if (board[row][col] == 1)
        {
            if (neighborCount == 2 || neighborCount == 3)
            {
                tempBoard[row][col] = 1;
            }
            else
            {
                tempBoard[row][col] = 0;
            }
        }
        else
        {
            if (neighborCount == 3)
            {
                tempBoard[row][col] = 1;
            }
            else
            {
                tempBoard[row][col] = 0;
            }
        }

        neighborCount = 0;
    }
}

//update board with new values from temp board
for(; row < height; row++)
{
    for(; col < width ; col++)
    {
        board[row][col] = tempBoard[row][col];
    }
}

}

我的问题是在功能结束时,我试图用我在tempBoard中保存的新值更新**板中的值。我确定我对双指针的理解不足,但是我无法弄清楚为什么董事会在从我的职能部门回来后重新印刷它与它的相同之处原始状态。我猜测我只是更新**板的本地副本而且当我退出我的功能时我失去了我的更改,但我完全迷失了我应该如何制作确定我的更改是在此功能之外看到的。

任何帮助都会非常感激,我一直在尽我所能来解决这个问题,但我现在只是坚持做什么。如果您需要我的信息,请告诉我。

1 个答案:

答案 0 :(得分:3)

rowcol正在两个不同的循环中使用,并且它们的值不会在循环之间重置。因此,当您将临时板复制到主板时,row已经等于height并且循环立即中断。

这样做:

//update board with new values from temp board
for(row = 0; row < height; row++)
{
    for(col = 0; col < width ; col++)
    {
        board[row][col] = tempBoard[row][col];
    }
}