C 康威';《生活的游戏》第11集
我正试着用C语言写康威的《生命的游戏》。这就是我目前所拥有的。我使用指针来引用数组,这以前从来没有给我带来过问题,但是函数place\u cell导致了一个segfault 以下是我迄今为止所尝试的: -我试着用常数100 x 100和10 x 10制作网格。修改 这些恒定网格中的值仍然给我一个错误。 -我试着用常量替换place_cell,但仍然有一个错误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
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:您必须在启用调试支持的情况下编译。无意冒犯,但在开始这样一个项目之前,你真的应该做一些基础知识的教程。这本应该是你课上的一部分。评论不是为了进行深入的讨论;这段对话已经结束。