GCC:数组类型具有不完整的元素类型

c arrays gcc struct 2020-03-21 09:27:22


我声明了一个struct,并试图将这些struct的数组(以及一个double的double数组和一个整数)传递给一个函数。编译时,我从gcc得到一条“array type has incomplete element type”消息。我在如何将结构传递到函数中时出错了什么?
typedef struct graph_node {
int X;
int Y;
int active;
} g_node;
void print_graph(g_node graph_node[], double weight[][], int nodes);

我也尝试过
struct g_node graph_node[]
,但我得到了同样的结果。





2 答案



是数组造成了以下问题:
void print_graph(g_node graph_node[], double weight[][], int nodes);

必须给出第二个维度和后续维度:
void print_graph(g_node graph_node[], double weight[][32], int nodes);

或者您可以只给指针一个指针:
void print_graph(g_node graph_node[], double **weight, int nodes);

但是,虽然它们看起来很相似,但它们在内部是非常不同的。
如果您使用的是C99,则可以使用可变限定数组。引用C99标准中的一个例子(第6.7.5.2节数组声明器):
void fvla(int m, int C[m][m]); // valid: VLA with prototype scope
void fvla(int m, int C[m][m]) // valid: adjusted to auto pointer to VLA
{
typedef int VLA[m][m]; // valid: block scope typedef VLA
struct tag {
int (*y)[n]; // invalid: y not ordinary identifier
int z[n]; // invalid: z not ordinary identifier
};
int D[m]; // valid: auto VLA
static int E[m]; // invalid: static block scope VLA
extern int F[m]; // invalid: F has linkage and is VLA
int (*s)[m]; // valid: auto pointer to VLA
extern int (*r)[m]; // invalid: r has linkage and points to VLA
static int (*q)[m] = &B; // valid: q is a static block pointer to VLA
}

在我的main()中注释中的问题,我试图传递到函数中的变量是一个
double array[][]
,那么我如何将它传递到函数中?将
array[0][0]
传递给它会给出不兼容的参数类型,正如
&array
&array[0][0]

在您的
main()中,变量应该是:
double arraydouble array[][20] = { { 1.0, 0.0, ... }, ... };
[20];

或类似的;可能是
[10]

您应该能够通过有了这样的代码:
typedef struct graph_node
{
int X;
int Y;
int active;
} g_node;
void print_graph(g_node graph_node[], double weight[][20], int nodes);
int main(void)
{
g_node g[10];
double array[10][20];
int n = 10;
print_graph(g, array, n);
return 0;
}

可以干净地编译GCC4.2(i686-apple-darwin11-llvm-GCC-4.2(GCC)4.2.1(基于apple Inc.build 5658)(llvm build 2336.9.00))和Mac OS X 10.7.3上的GCC4.7.0,使用命令行:
/usr/bin/gcc -O3 -g -std=c99 -Wall -Wextra -c zzz.c

2020-03-21 09:27:30


编译器需要知道二维数组中第二个维度的大小。例如:
void print_graph(g_node graph_node[], double weight[][5], int nodes);

2020-03-21 09:27:38


World is powered by solitude
备案号:湘ICP备19012068号