嗨,我的c代码有问题,它一直崩溃没有错误,我不知道为什么。我试图在2d数组内的某个点找到值,例如[1] [1]并查看该值是什么(只有1或0),然后根据它的1或0来处理该值该程序一直没有错误崩溃,我不知道为什么。请帮助
typedef struct gol{ // structure containing a square board
int **board; // pointer to a pointer
size_t size; //size_t = unnasigned value
}gol;
使用
在main中创建结构struct gol *GAME;
GAME = create_gol(30);
如果选择了选项,则使用if菜单选项只会调用 下一个模式功能,但它崩溃
gol* create_gol(size_t size){
struct gol *Game_Of_Life;
Game_Of_Life = (struct gol*)malloc(sizeof(struct gol*)); //dynamically create the struct the ptr is pointing to **IMPORTANT
Gameboard = new int*[size];
for (int i = 0; i < size; ++i) {
Gameboard[i] = new int[size];
// each i-the pointer is now pointing to dynamic array (size 20) of actual int values
}
for (int i = 0; i < size; ++i) { // for each row
for (int j = 0; j < size; ++j) { // for each column
Gameboard[i][j] = 0;
}
}
Game_Of_Life->board=Gameboard;
Game_Of_Life->size=size;
return Game_Of_Life;
}
void next_pattern(gol* g)
{
for (int i = 0; i < 20; ++i) { // for each row
for (int j = 0; j < 20; ++j) { // for each column
int sum = neighbour_sum(g,i,j);
if (g->board[i][j]==1){
if (sum<2){
g->board[i][j]=0;
}
if (sum==3 || sum==2 ){
g->board[i][j]=1;
}
if (sum>3){
g->board[i][j]=0;
}
}
if (g->board[i][j]==0 && sum==3){
g->board[i][j]=1;
}
}
}
}
更新邻居总数,因此它无法超出界限程序仍然崩溃
int neighbour_sum(gol* g, int i, int j)
{ int sum;
if ((g->board[(i-1+g->size)%g->size][j])==1){ // left
sum++;
}
if ((g->board[(i-1+g->size)%g->size][(j-1+g->size)%g->size])==1){//left up
sum++;
}
if ((g->board[i][(j-1+g->size)%g->size])==1){ //up
sum++;
}
if ((g->board[(i+1)%g->size][(j+1)%g->size])==1){ //right up
sum++;
}
if ((g->board[i][(j+1)%g->size])==1){ //right
sum++;
}
if ((g->board[(i+1)%g->size][(j+1)]%g->size)==1){//right bottom
sum++;
}
if ((g->board[i][(j+1)%g->size])==1){//bottom
sum++;
}
if ((g->board[(i-1+g->size)%g->size][(j+1)%g->size])==1){// bottom left
sum++;
}
return sum;
}
答案 0 :(得分:0)
这些行
for (int i = 0; i < 20; ++i) { // for each row
for (int j = 0; j < 20; ++j) { // for each column
int sum = neighbour_sum(g,i,j);
表示您首先调用neighbour_sum
i
和j
为零。
在neighbour_sum
内你做:
if ((g->board[(i-1)][j])==1){ // left
^^^^
因为i
和j
都是零,实际上是:
if ((g->board[-1][0])==1){ // left
^^^^
ups
所以你访问数组越界。这可能会导致崩溃。在任何情况下都是非法的。
一般问题似乎是当点位于电路板边缘时您无法处理。
OP发布更多代码后编辑
这是错误的
Game_Of_Life = (struct gol*)malloc(sizeof(struct gol*));
^^^
DO
Game_Of_Life = malloc(sizeof(struct gol));
答案 1 :(得分:0)
我最终找到了解决方案,其中包括i在内的一些问题正在寻找使用
解决的数组之外的值if ((g->board[(i-1+g->size)%g->size][j])==1){ // left
sum++;
}
我也使用c ++语法而不是c语法使用malloc函数解析
Game_Of_Life = (struct gol*)malloc(sizeof(struct gol));
导致崩溃的最后一个问题仍然是函数邻居sum返回-2,因为它没有正确地初始化为
int sum = 0;