所以我需要创建一个指向某个名为“cell”的结构的指针的二维字段,并且执行此操作的函数需要返回整个事物的指针。
3x3示例:
((指向cell11指针指向cell21指针指向cell31)
(指向cell12指针指向cell22指针指向cell23)
(指向cell13指针指向cell23指针指向cell33))
这是我到目前为止的功能代码: 它由一个双循环组成,首先我创建一个指针数组,指向2维字段的每一行,然后我遍历每个指针,我指向每个列指针,我遍历每个单元格列并将其指向一个单元格,这样当我想访问单元格nr(2,4)时,我只需要访问指针数组[2] [4]
编辑:我根据评论改变了功能,但我仍然在第26行得到错误解除指向不完整类型的指针
cell_pointer->state = 1;
,这是新代码:
#include <stdlib.h>
#include <stdio.h>
#include "cell.h"
struct Cell ***allocate_field(int field_width, int field_height){
struct Cell*** kolommen = malloc(field_width * sizeof *kolommen);
int i;
int j;
for(i=1;i == field_width;i++){
kolommen[i] = malloc(field_width * sizeof (struct Cell**));
for(j=1;j == field_height;j++){
struct Cell *cell_pointer;
kolommen[i][j] = malloc( sizeof (struct Cell*));
kolommen[i][j] = cell_pointer;
cell_pointer->state = 1;
}
}
return kolommen;
以下是负责定义结构单元格的代码:
#ifndef CELL_H_
#define CELL_H_
enum Group {
A, B
};
enum State {
ALIVE, DEAD
};
struct Cell {
enum Group group;
enum State state;
};
#endif /* CELL_H_ */
我在这里粘贴的第一段代码中得到的2个错误是
1)在第26行取消引用指向不完整类型的指针
(*cell)->State = DEAD;
2)从第30行的不兼容指针类型返回:
return kolommen;
答案 0 :(得分:1)
首先,这个
struct cell*** kolommen = (struct cell***) malloc(field_width * sizeof(struct cell***));
应该是
struct cell*** kolommen = malloc(field_width * sizeof(struct cell**));
和这个
struct cell** rij = (struct cell**) malloc(field_width * sizeof(struct cell**));
应该是
struct cell** rij = malloc(field_width * sizeof(struct cell*));
注意间接的程度。
更灵活(并且更容易出错)的方法是:
struct cell*** kolommen = malloc(field_width * sizeof *kolommen);
和
struct cell** rij = malloc(field_width * sizeof *rij);
请注意,投下malloc()
&amp;的结果不需要朋友,也不推荐使用C.
答案 1 :(得分:0)
错误来自于混合使用struct cell
和声明struct Cell
。 struct cell
是未知的,因此被视为不完整类型(对于未知结构)。其他评论也适用:实际创建单元格时缺少malloc。
另外,行
struct cell *cell;
(*cell)->State = DEAD;
是错误的,因为->
运算符已经执行了间接。因此你要么写
struct cell *cell;
// ... initialize the pointer somehow (missing in the original code)
cell->State = DEAD;
或
struct cell *cell;
// init...
(*cell).State = DEAD;
这两者是等价的。
作为一种风格问题,我发现将结构和变量命名为struct cell *cell;
一样令人困惑,尽管这在C语言中是完全合法的(结构&#34;名称标签&#34;以不同的名称生活空间)。在C ++中,struct标签会自己引入一个类型,如果它也被用作变量名,我想这可能会导致麻烦。 (但是g ++编译得很好。)