gpt4 book ai didi

C忽略 "if"指令

转载 作者:太空宇宙 更新时间:2023-11-04 00:50:59 28 4
gpt4 key购买 nike

我最近制作的程序有问题。基本上,它是 John Conway 人生游戏的简单版本,但它运行不正常。问题出在读取单元格及其邻居的状态并决定该单元格的 future 状态的代码中。这是代码的一部分(有点长):

#include<stdio.h>
#include<conio.h>

//Game grid size
#define SIZE 15

//Cell state (wall is a special state. It protects the other cells from garbage data of the heap memory)
enum cellState {dead,alive,wall};

//Function prototypes
int** load(int**);
void process(int**);

int main(){

//Game grid (2-D matrix) and its memory allocation
int** grid;

grid=(int**)calloc(SIZE+2,sizeof(int*));
for(int cont=0;cont<SIZE+2;cont++){
*(grid+cont)=(int*)calloc(SIZE+2,sizeof(int));
}

load(grid);
getch();
process(grid);
getch();
}

//Grid loading function
int** load(int** grid){

int type;
srand(12345);
for(int cont=0;cont<SIZE+2;cont++){
for(int cont2=0;cont2<SIZE+2;cont2++){
if(cont==0||cont==TAMANO+1||cont2==0||cont2==TAMANO+1){
*(*(grid+cont)+cont2)=wall;
}
else{
//Cell type decision
type=(int)((rand()*2+1)/32767);
if(type==dead){
*(*(grid+cont)+cont2)=dead;
}
else if(type==alive){
*(*(grid+cont)+cont2)=alive;
}
}
}
}
//Grid impression
for(int cont=0;cont<SIZE+2;cont++){
for(int cont2=0;cont2<SIZE+2;cont2++){
if(*(*(grid+cont)+cont2)==wall){
printf("W ");
}
else if(*(*(grid+cont)+cont2)==dead){
printf(". ");
}
else if(*(*(grid+cont)+cont2)==alive){
printf("C ");
}
}
printf("\n");
}
return(grid);
}


void process(int** grid){

//Temporary grid that saves the next state of a cell
int** gridTemp;
//Generations (turns) counter and live neighbours counter
int generations=0,liveNeighbours=0;
gridTemp=(int**)calloc(SIZE+2,sizeof(int*));
for(int cont=0;cont<SIZE+2;cont++){
*(gridTemp+cont)=(int*)calloc(SIZE+2,sizeof(int));
}

for(int cont=0;cont<SIZE+2;cont++){
for(int cont2=0;cont2<SIZE+2;cont2++){
if(cont==0||cont==SIZE+1||cont2==0||cont2==SIZE+1){
*(*(gridTemp+cont)+cont2)=wall;
}
}
}

//Processing loop
while(generations<100){

system("cls");

for(int cont=1;cont<SIZE+1;cont++){
for(int cont2=1;cont2<SIZE+1;cont2++){
for(int comp1=-1;comp1<2;comp1++){
for(int comp2=-1;comp2<2;comp2++){
if(comp1==0&&comp2==0) continue;
else{
//Here, we read the state of the neighbour cells of a certain cell
if(*(*(grid+cont)+cont2)==dead){
if(*(*(grid+cont+comp1)+cont2+comp2)==alive){
liveNeighbours+=1;
}
}
else if(*(*(grid+cont)+cont2)==alive){
if(*(*(grid+cont+comp1)+cont2+comp2)==alive){
liveNeighbours+=1;
}
}
}
}
}
//Future state calculation. Here is where the code fails. This if compares the state of a certain cell and the "dead" enumeration
if(*(*(grid+cont)+cont2)==dead){
if(liveNeighbours==3){
*(*(gridTemp+cont)+cont2)==alive;
}
else{
*(*(gridTemp+cont)+cont2)==dead;
}
}
if(*(*(grid+cont)+cont2)==alive){
//It also fails here. This if checks the value of the liveNeighbours variable
if(liveNeighbours>=2&&liveNeighbours<=3){
*(*(gridTemp+cont)+cont2)==alive;
}
//And here too
if(liveNeighbours<2||liveNeighbours>3){
*(*(gridTemp+cont)+cont2)==dead;
}
}
liveNeighbours=0;
}
}
//Here, the program copies the temporary grid onto the normal grid
for(int cont=0;cont<SIZE+2;cont++){
for(int cont2=0;cont2<SIZE+2;cont2++){
*(*(grid+cont)+cont2)=*(*(gridTemp+cont)+cont2);
if(*(*(grid+cont)+cont2)==wall){
printf("W ");
}
else if(*(*(grid+cont)+cont2)==dead){
printf(". ");
}
else if(*(*(grid+cont)+cont2)==alive){
printf("A ");
}
}
printf("\n");
}
generations++;
getch();
}
return;
}

使用 Dev-C++ 调试工具,我能够看到代码在我标记的点处失败。简单地说,它会忽略那些“if”指令中的代码,即使满足条件也是如此。

我也重建了这段代码几次并在另一个编译器中尝试过,但它也失败了。 Turbo-C++ 表示错误代码中的指令无效。

最佳答案

在代码片段中:

                  if(liveNeighbours==3){
*(*(gridTemp+cont)+cont2)==alive;
}
else{
*(*(gridTemp+cont)+cont2)==dead;
}

您没有将值“alive”或“dead”分配给单元格 - 您正在检查它是否相等(因为 == 比较)。我很确定这不是您打算做的?

同样的事情发生在“if 语句失败”的另一个地方:

             if(liveNeighbours>=2&&liveNeighbours<=3){
*(*(gridTemp+cont)+cont2)==alive;
}
//And here too
if(liveNeighbours<2||liveNeighbours>3){
*(*(gridTemp+cont)+cont2)==dead;
}

我认为将这四个 == 符号替换为 = 会有所帮助。

关于C忽略 "if"指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18805702/

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