Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 康威';《生活的游戏》第11集_C_Conways Game Of Life - Fatal编程技术网

C 康威';《生活的游戏》第11集

C 康威';《生活的游戏》第11集,c,conways-game-of-life,C,Conways Game Of Life,我正试着用C语言写康威的《生命的游戏》。这就是我目前所拥有的。我使用指针来引用数组,这以前从来没有给我带来过问题,但是函数place\u cell导致了一个segfault 以下是我迄今为止所尝试的: -我试着用常数100 x 100和10 x 10制作网格。修改 这些恒定网格中的值仍然给我一个错误。 -我试着用常量替换place_cell,但仍然有一个错误 int** make_grid(int x, int y) { int** is = (int**)malloc(sizeof(i

我正试着用C语言写康威的《生命的游戏》。这就是我目前所拥有的。我使用指针来引用数组,这以前从来没有给我带来过问题,但是函数place\u cell导致了一个segfault

以下是我迄今为止所尝试的: -我试着用常数100 x 100和10 x 10制作网格。修改 这些恒定网格中的值仍然给我一个错误。 -我试着用常量替换place_cell,但仍然有一个错误

int** make_grid(int x, int y) {
    int** is = (int**)malloc(sizeof(int*) * y);
    if(! is) {
        fprintf(stderr, "make_grid: malloc failed");
        exit(1);
    }
    int j;
    for(j = 0; j < y; j++) {
        is[j] = (int*)malloc(sizeof(int) * x);
        if(!is[j]) {
            fprintf(stderr, "make_grid: malloc failed");
            exit(1);
        }
    }
    return is;
}

/* takes two integers and places a cell at those coords */
void place_cell(int** is, int sidex, int sidey, int x, int y) {
    if(x >= sidex || y >= sidey) {
        fprintf(stderr, "place_cell: out of grid range\n");
        exit(1);
    }
    is[y][x] = 1;
}

int check_surroundings(int** is, int sidex,
                       int sidey, int x, int y) {
    int y_less = y - 1;
    if(y == 0) {
        y_less = sidey - 1;
    }
    int y_more = y + 1;
    if(y == sidey - 1) {
        y_more = 0;
    }
    int x_less = x - 1;
    if(x == 0) {
        x_less = sidex - 1;
    }
    int x_more = x + 1;
    if(x == sidex - 1) {
        x_more = 0;
    }
    int p = is[y_less][x_less] +
        is[y_less][x] +
        is[y_less][x_more] +
        is[y][x_less] +
        is[y][x_more] +
        is[y_more][x_less] +
        is[y_more][x_less] +
        is[y_more][x_more];
    return p;
}

void change_condition(int** is,
                      int sidex, int sidey, int x, int y) {
    int* state = &is[y][x];
    int surr = check_surroundings(is, sidex, sidey, x, y);
    if(surr > 3) {
        *state = 0;
    } else if(surr == 3 || surr == 2) {
        *state = 1;
    } else {
        *state = 0;
    }
}

void print_grid(int** is, int sidex, int sidey) {
    int i, j;
    for(i = 0; i < sidey; i++) {
        for(j = 0; j < sidex; j++) {
            if(is[i][j] == 1) {
                printf("*");
            } else {
                printf(" ");
            }
        }
        printf("\n");
    }
}

void new_generation(int** is, int sidex, int sidey) {
    int i, j;
    for(i = 0; i < sidey; i++) {
        for(j = 0; j < sidex; j++) {
            change_condition(is, sidex, sidey, j, i);
        }
    }
}

void play(int** is, int sidex, int sidey) {
    int i = 0;
    while(i < 100) {
        new_generation(is, sidex, sidey);
        print_grid(is, sidex, sidey);
        i++;
    }
}
int**make_网格(int x,int y){
int**is=(int**)malloc(sizeof(int*)*y);
如果(!is){
fprintf(标准“生成网格:malloc失败”);
出口(1);
}
int j;
对于(j=0;j=sidex | | y>=sidey){
fprintf(stderr,“放置单元:超出网格范围\n”);
出口(1);
}
是[y][x]=1;
}
检查周围环境(int**is,int sidex,
整数倍,整数倍,整数倍){
int y_less=y-1;
如果(y==0){
y_less=sidey-1;
}
int y_more=y+1;
如果(y==sidey-1){
y_more=0;
}
int x_less=x-1;
如果(x==0){
x_less=sidex-1;
}
int x_more=x+1;
如果(x==sidex-1){
x_more=0;
}
int p=is[y_less][x_less]+
是[y_减去][x]+
是[y_less][x_more]+
是[y][x_]+
是[y][x_更多]+
是[y_更多][x_更少]+
是[y_更多][x_更少]+
是[y_more][x_more];
返回p;
}
无效变更条件(int**is,
整数倍,整数倍,整数倍,整数倍,整数倍){
int*state=&is[y][x];
int surr=检查周围环境(is,sidex,sidey,x,y);
如果(surr>3){
*状态=0;
}else if(surr==3 | | surr==2){
*状态=1;
}否则{
*状态=0;
}
}
无效打印网格(int**is,int-sidex,int-sidey){
int i,j;
对于(i=0;i
以下是我的主要观点:

int main(int argc, char* argv[]) {

    int sidex = atoi(argv[0]);
    int sidey = atoi(argv[1]);
    int** is = make_grid(10, 10);
    int i;
    for(i = 2; i < argc; i += 2) {
        place_cell(is, sidex, sidey,
                   atoi(argv[i]), atoi(argv[i + 1]));
    }

    return 0;
}
intmain(intargc,char*argv[]){
int sidex=atoi(argv[0]);
int sidey=atoi(argv[1]);
int**is=制作网格(10,10);
int i;
对于(i=2;i
编辑:

int** make_grid(int x, int y) {
    int (*is)[x] = (int*)malloc(sizeof(int) * y * x);
    if(! is) {
        fprintf(stderr, "make_grid: malloc failed");
        exit(1);
    }
    int j;
    for(j = 0; j < y; j++) {
        is[j] = (int*)malloc(sizeof(int) * x);
        if(!is[j]) {
            fprintf(stderr, "make_grid: malloc failed");
            exit(1);
        }
    }
    return is;
}
int**make_网格(int x,int y){
int(*is)[x]=(int*)malloc(sizeof(int)*y*x);
如果(!is){
fprintf(标准“生成网格:malloc失败”);
出口(1);
}
int j;
对于(j=0;j

这一点都不对,但我不知道为什么。有人能给我解释一下我五岁时该做什么改变吗?(我猜是一个懂C的五岁小孩)

你没有用这种语法声明一个二维数组,因此内存没有按照你的想法对齐,因此是一个分段错误。声明指针int**不会使其成为二维数组。(你肯定不认为int***会为你带来一个数据立方体?)


上面的一个注释给出了另一个问题,C程序的零参数argv[0]是程序的名称,而不是命令行上的第一个参数,即argv[1]。

我刚刚复制了您的整个代码并尝试运行该程序。内存访问冲突(至少对我而言)如下所示:

int sidex = atoi(argv[0]);
int sidey = atoi(argv[1]);    <-- memory access violation
intsidex=atoi(argv[0]);

int sidey=atoi(argv[1]);虽然这是关于二维阵列的好建议和正确建议,但它并没有回答这个问题。这主要是我在我的评论中写的。上面已经更新了,我仍然无法指出哪里出了问题。我认为不止一个,因为当我完全删除代码并传递常量时,我仍然有问题。Bugger是你的朋友;-)我可以建议您使用图形化IDE吗?就像免费的微软Visual Studio(在Windows上)。调试器集成在其中,非常易于使用。@YePhIcK:调试不需要IDE。gdb在控制台上运行良好。@A.Hunter:您必须在启用调试支持的情况下编译。无意冒犯,但在开始这样一个项目之前,你真的应该做一些基础知识的教程。这本应该是你课上的一部分。评论不是为了进行深入的讨论;这段对话已经结束。