[英]Conway's Game of Life issue updating board
所以我正在為學校開發一個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中保存的新值更新**板中的值。 我確定這是我對雙指針的理解不足,但是我無法弄清楚為什么當我從函數返回后重新打印自己時,它與原始狀態相同。 我猜我只是更新**板的本地副本,當我退出我的功能時我失去了我的更改,但我完全迷失了我應該如何確保我的更改在此之外被看到功能。
我會非常感激任何幫助,我一直在盡我所能來解決這個問題,但我現在只是堅持做什么。 如果您需要我的信息,請告訴我。
row
和col
正在兩個不同的循環中使用,並且它們的值不會在循環之間重置。 因此,當您將臨時板復制到主板時, 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];
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.