从C中的struct访问数组

时间:2010-01-29 17:36:57

标签: struct multidimensional-array field

在我的data.h文件中,我有:

typedef struct {
    double ***grid;
} Solver;

在我的.c文件中

static Solver _solver;

首先调用函数在网格上进行一些分配,例如

_solver.grid = malloc(....);

//then makes a call to

GS_init(_solver.grid);

GS_init函数在GS.h中声明为:

void GS_init(double ***grid);

当我尝试编译时,我收到两个错误:

the struct "<unnamed>" has no field "grid"
GS_init(_solver.grid)
^

too many arguments in function call
GS_init(_solver.grid)
^

任何想法在这里出了什么问题?

1 个答案:

答案 0 :(得分:1)

此代码使用'gcc -Wall -Werror -c'编译:

data.h

typedef struct
{
    double ***grid;
} Solver;

gs.h

extern void GS_init(double ***grid);

gs.c

#include "data.h"
#include "gs.h"
#include <stdlib.h>

static Solver _solver;

void anonymous(void)
{
    _solver.grid = malloc(32 * sizeof(double));
    GS_init(_solver.grid);
}

德瑞克问道:

  

为什么这样做?是因为extern关键字吗?

'extern'并不适合它,但我总是使用它。

  

当我必须充实GS_init()时,比如compute.c,我会写void GS_init(double ***grid){ //loop over grid[i][j][k] setting to zero }

排序......是的,如果数据结构设置正确,GS_init()代码可以这样做,这将需要比结构中当前可见的更多信息。

让编译器处理:

grid[i][j][k] = 0.0;

代码必须知道每个i,j和k的有效范围;假设每个维度中的行数是N i ,N j ,N k grid指向的数据“结构”必须是N i 'double **'值的数组 - 必须分配。每个条目必须指向N j 'double *'值。因此,您必须进行比单个malloc()更多的分配,并且您必须进行更多初始化,而不仅仅将所有内容设置为零。

如果您只想使用单个数组的双精度数,则必须编写不同的表达式来访问数据:

grid[(i * Ni + j) * Nj + k] = 0.0;

在这种情况下,grid将是一个简单的double *,而不是三指针。