在我的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)
^
任何想法在这里出了什么问题?
答案 0 :(得分:1)
此代码使用'gcc -Wall -Werror -c'编译:
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);
}
为什么这样做?是因为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 *
,而不是三指针。