gpt4 book ai didi

c - C 中的蜂窝自动化存在问题

转载 作者:行者123 更新时间:2023-11-30 17:34:26 26 4
gpt4 key购买 nike

现在已经纠正了 GCC 引发的所有错误,输出与以前不同,但仍然只更改一次。

输出:

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 1 0 0 0

0 0 0 0 0 0 0 1 1 0

0 0 0 0 0 0 0 0 0 1

它在 40 次传递中保持这种状态,这是不应该的

新的(无警告)代码:

signed char board [10][10]; //the board
int evaluate_cell (int i, int a);
int evaltheboard(void){
//loops through the array, and stops to check if there is a living cell. leiving cells are represented by a 1.
int i,a;
signed char cell_to_check [1][1];
for (a=0;a<=9;a++){
for (i=0;i<=9;i++){
cell_to_check[0][0] = board[i][a];
if (cell_to_check[0][0] != 0){
evaluate_cell(i,a);
}
}
}
return 0;
}

int evaluate_cell(int i,int a){
// checks near by cells to see if there are any living and chooses whether the cell should live based off of it's living neighbors.
signed char live_n_cells = 0, empty_x_mod, empty_y_mod;
signed char x_inc [8] = {0,1,1,1,0,-1,-1,-1}, y_inc [8]={-1,-1,0,1,1,1,0,-1};
int z, x, y;
x=y=0;
//printf("evaling cell\n");
//printf ("co-ords being checked [%d][%d]", i,a);
for (z=0;z<=7;z++){
if (board[(i+(x_inc[x]))][(a+(y_inc[y]))] != 0){
++live_n_cells;
}
else if(board[(i+(x_inc[x]))][(a+(y_inc[y]))] == 0){
empty_x_mod = i-(x_inc[x]) ;
empty_y_mod = a-(y_inc[y]);
}
y++;
x++;
}
//printf("%d = z, %d = y, %d = x\n", z, y, x);//debug
//printf("|close living cells = %d\n", live_n_cells); // debug
//printf("|empty mods are %d %d\n", empty_x_mod, empty_y_mod); //debug
if (live_n_cells >= 3){
board[i][a] = 0;
}
else if (live_n_cells == 0){
board[i][a] = 0;
}
else if (live_n_cells == 1 || 2){
board[empty_x_mod][empty_y_mod] = 1;
}
return 0;

}

int print_array(void){
//prints array
int i,a;
for (a=0;a<=9;a++){
for (i=0;i<=9;i++){
printf(" %d", board[i][a]);
//printf("%d", i);
}

printf("\n");
}
printf("----------\n");

return 0;
}

int main(void){
int x;
//runs the damned thing
board[5][5] = 1; //DEBUG
board[5][6] = 1; //DEBUG
board[6][5] = 1; //DEBUG
for (x=0;x<40;x++){
evaltheboard();
print_array();
}
return 0;

}

老问题:

就像标题所说,我的输出出乎意料地停滞不前。该程序的功能应该类似于康威的生命游戏。当我运行这个版本时,它更改了“board”数组一次,并且似乎不再这样做。输出最终看起来像这样(0 = 空单元格,1 = 活单元格):

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 1 0 0 0 0

0 0 0 0 0 1 0 1 0 0

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 1 0 0

0 0 0 0 0 0 0 0 0 0

所以从理论上讲,两个相邻的应该重新繁殖,而孤立的应该已经灭绝,但它们没有。任何有关为什么会出现这种情况的帮助都将得到感谢。

请不要太严厉,这是我从头开始编写的第一个真正的 c 项目。任何有关我的一般代码形式的反馈都将受到赞赏

代码:

signed char board [10][10]; //the board
int evaltheboard(void){
//loops through the array, and stops to check if there is a living cell. living cells are represented by a 1.
int i,a;
signed char cell_to_check [1][1] = {0};
for (a=0;a<=9;a++){
for (i=0;i<=9;i++){
cell_to_check[0][0] = board[i][a];
if (cell_to_check[0][0] != 0){
evaluate_cell(i,a);
}
}
}
return 0;
}

int evaluate_cell(int i,int a){
// checks near by cells to see if there are any living and chooses whether the cell should live based off of it's living neighbors.
signed char live_n_cells = 0, empty_x_mod, empty_y_mod;
signed char x_inc [8] = {0,1,1,1,0,-1,-1,-1}, y_inc [8]={-1,-1,0,1,1,1,0,-1};
int z, x, y;
x=y=0;
//printf("evaling cell\n");
//printf ("co-ords being checked [%d][%d]", i,a);
for (z=0;z<=7;z++){
if (board[(i+(x_inc[x]))][(a+(y_inc[y]))] != 0){
++live_n_cells;
}
else(board[(i+(x_inc[x]))][(a+(y_inc[y]))] == 0);{
empty_x_mod = i-(x_inc[x]) ;
empty_y_mod = a-(y_inc[y]);
y++;
x++;
}
}
//printf("%d = z, %d = y, %d = x\n", z, y, x);//debug
//printf("|close living cells = %d\n", live_n_cells); // debug
//printf("|empty mods are %d %d\n", empty_x_mod, empty_y_mod); //debug
if (live_n_cells >= 3){
board[i][a] = 0;
}
else if (live_n_cells = 0){
board[i][a] = 0;
}
else(live_n_cells = 1 || 2);{
board[empty_x_mod][empty_y_mod] = 1;
}
return 0;

}

int print_array(void){
//prints array
int i,a;
for (a=0;a<=9;a++){
for (i=0;i<=9;i++){
printf(" %d", board[i][a]);
//printf("%d", i);
}

printf("\n");
}
printf("----------\n");

return 0;
}

int main(void){
int x;
//runs the damned thing
board[5][5] = 1; //DEBUG
board[5][6] = 1; //DEBUG
board[6][5] = 1; //DEBUG
for (x=0;x<40;x++){
evaltheboard();
print_array();
}
return 0;

}

注意:前面带//的printf仅用于调试,main中的for循环只是临时的。我计划花一段时间检查一下是否还有东西还活着。如果之后显示//DEBUG,那么它也是临时的。

无论如何,谢谢!

最佳答案

您需要在代码中查看一些内容。如果您使用 gcc,您可以做的最好的事情就是启用编译器警告。添加-Wall (警告所有)标记到编译行,因此要编译使用:

gcc -Wall source.c -o Program

大多数编译器都支持某种警告标志/选项。当我用这个标志编译你的代码时,我得到了以下输出(稍微修剪了一下):

7:5: warning: missing braces around initializer [-Wmissing-braces]
signed char cell_to_check [1][1] = {0};

31:13: warning: statement with no effect [-Wunused-value]
else(board[(i+(x_inc[x]))][(a+(y_inc[y]))] == 0);{

44:5: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
else if (live_n_cells = 0){

12:17: warning: implicit declaration of function ‘evaluate_cell’ [-Wimplicit-function-declaration]
evaluate_cell(i,a);

当我解决并修复这些问题时,编译器提供了更多问题,但最终您应该有一个很好的无警告程序(表明您的代码可能是正确的)。

上面的第一个警告是因为您试图将一个包含一个元素的数组分配给一个变量,该变量需要一个数组和一个元素的数组。

上面的第二个警告是因为您缺少 if在你的 else 之后,所以这应该是 else if (...) ,但是您应该注意的是您有一个 ;在大括号之前,这可能根本不应该存在,您应该检查代码并确保没有多余的 ; s 在大括号之前。

第三个警告可能是因为您正在做作业 live_n_cells = 0而不是检查 live_n_cells == 0 。如果您确实打算做作业,请写 (live_n_cells = 0) 。避免每次意外分配的一个好方法是使用 0 == live_n_cells ,这样如果您忘记了第二个等号,您就永远不会进行赋值。

第四个警告是关于缺少函数声明的。要解决此问题,您可以添加类似 int evaluate_cell(int i,int a); 的内容到源文件的顶部。

尝试这些操作,然后发布您的问题的更新(这些提示甚至可能有助于解决您的问题)。

编辑:

更多提示:

函数可以声明为 void ,这意味着它们不返回值。这在您的程序中可能很有用,因为 evaluate_cell当前返回 0,您可以忽略它。你可以写 void evaluate_cell(int i, int j) ,但请记住也要更改源文件顶部的声明。

我检查了你的复制代码,它似乎没有包含所有的生命游戏操作(至少根据维基百科页面 http://en.wikipedia.org/wiki/Conway 's_Game_of_Life),请尝试以下操作:

if (live_n_cells == 3 && board[i][a] == 0) {  // production
temp_board[i][a] = 1;
} else if (live_n_cells > 3) { // over population
temp_board[i][a] = 0;
} else if (live_n_cells < 2) { // under population
temp_board[i][a] = 0;
} else { // reproduction
temp_board[i][a] = board[i][a];
}

并且还为所有细胞调用评估细胞例程,而不仅仅是当前存活的细胞。您可能还注意到变量 temp_board 的使用在上面的代码中。这与 aschepler 对您的问题发表的评论有关。我还将板的定义更改为以下内容: +2正在填充以确保您永远不会尝试访问数组外部的元素。

#define WIDTH 10
#define HEIGHT 10

signed char board [HEIGHT+2][WIDTH+2]; ///< the board
signed char temp_board [HEIGHT+2][WIDTH+2]; ///< temporary board

最后我改了evaluateboard中的代码至:

int i, j;     ///< loop counters

// Evaluate each cell in array
for (j=1; j<=HEIGHT; j++) {
for (i=1; i<=WIDTH; i++) {
evaluate_cell(j,i);
}
}

// copy temp_board into board
for (j=1; j<=HEIGHT; ++j) {
for (i=1; i<=WIDTH; ++i) {
board[j][i] = temp_board[j][i];
}
}

使用您的大部分代码,并进行上述一些调整,我成功地让康威的生命游戏运行并达到了预期的结果。

最后一个提示,C/C++ 中通常约定使用 i, j, k, l, m, n (通常按这个顺序)作为循环计数变量。

祝你好运。 :)

关于c - C 中的蜂窝自动化存在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23335139/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com