【问题标题】:access array from struct in C从C中的struct访问数组
【发布时间】:2010-01-29 17:36:56
【问题描述】:

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

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

【问题讨论】:

  • 看到三重指针时会感到害怕。它们有时是个好主意;它们很少是一个好主意。
  • GS.h 是否包含 data.h?从表面上看,如果两个标头都包含在您的“.c”文件的代码中,那么应该没有问题。
  • gs.h 和 data.h 是单独的文件。我已经修改了代码以使用三重指针(3d 数组)并且它运行得更快。现在我正在尝试将我在我的方法中拥有的数据的本地副本移回求解器结构。
  • 哦,是的,我明白你现在在说什么了。是的,在 .c 文件中,两者都包含

标签: struct multidimensional-array field


【解决方案1】:

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

数据.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' 并不重要,但我总是使用它。

当我必须在compute.c 中充实GS_init() 时,我会写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 的有效范围;假设每个维度的行数为 Ni, Nj, Nkgrid 指向的数据“结构”必须是 Ni 'double **' 值的数组 - 必须分配。这些条目中的每一个都必须指向 Nj 'double *' 值。因此,您必须进行比单个 malloc() 更多的分配,并且您必须进行更多的初始化,而不仅仅是将所有内容都设置为零。

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

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

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

【讨论】:

  • 为什么会这样?因为 extern 关键字?当我必须充实 GS_init() 时,比如说 compute.c,我会写 void GS_init(double ***grid){ //loop over grid[i][j][k] setting to zero }
  • 应该是NiNj,而不是Ni-1Nj-1
  • @BlueRaja:是的,你是对的;谢谢。太久没有做这种事了。
猜你喜欢
  • 2016-03-04
  • 1970-01-01
  • 2013-09-24
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
相关资源
最近更新 更多