Struct 从C中的结构访问数组

Struct 从C中的结构访问数组,struct,multidimensional-array,field,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);

在我的
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)
^

你知道这里出了什么问题吗

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

数据.h gs.h 一般事务委员会 代码必须知道i、j和k的有效范围;假设每个维度中的行数为Ni、Nj、Nk。
网格
指向的数据“结构”必须是一个Ni“double**”值数组,必须进行分配。每个条目都必须指向Nj“double*”值。因此,与单个
malloc()
相比,您必须进行更多的分配,并且您必须进行更多的初始化,而不仅仅是将所有内容设置为零

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

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

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

看到三个指针时会感到害怕。它们有时是个好主意;它们很少是一个好主意。GS.h是否包含数据.h?表面上看,如果这两个头都包含在“.c”文件的代码中,那么应该不会有问题。gs.h和data.h是独立的文件。我已经修改了使用三指针(3d数组)的代码,它运行得更快。现在我正在尝试将我在方法中拥有的数据的本地副本移回解算器结构。哦,是的,我明白你现在所说的。是的,在.c文件中,这两个都包括在内。为什么这样做?因为extern关键字?当我必须充实GS_init()时,比如compute.c,我会写void GS_init(double***grid){//loop over grid[I][j][k]设置为0}它应该是
Ni
Nj
,而不是
Ni-1
Nj-1
@BlueRaja:是的,你是对的;谢谢我已经很久没有做这种事情了。
typedef struct
{
    double ***grid;
} Solver;
extern void GS_init(double ***grid);
#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);
}
grid[i][j][k] = 0.0;
grid[(i * Ni + j) * Nj + k] = 0.0;