如何创建由指针组成的二维字段

时间:2015-12-13 13:41:50

标签: c++ c arrays pointers

所以我需要创建一个指向某个名为“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;  

2 个答案:

答案 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 Cellstruct 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 ++编译得很好。)