Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GCC: Array type has incomplete element type

I have declared a struct, and I try to pass an array of those structs (as well as a double array of doubles, and an integer) into a function. I get an "array type has incomplete element type" message from gcc when I compile it. What have I gotten wrong in how I pass the struct to the function?

typedef struct graph_node {   int X;   int Y;   int active; } g_node;  void print_graph(g_node graph_node[], double weight[][], int nodes); 

I have also tried struct g_node graph_node[], but I get the same thing.

like image 803
Joshua Soileau Avatar asked Apr 04 '12 00:04

Joshua Soileau


1 Answers

It's the array that's causing trouble in:

void print_graph(g_node graph_node[], double weight[][], int nodes); 

The second and subsequent dimensions must be given:

void print_graph(g_node graph_node[], double weight[][32], int nodes); 

Or you can just give a pointer to pointer:

void print_graph(g_node graph_node[], double **weight, int nodes); 

However, although they look similar, those are very different internally.

If you're using C99, you can use variably-qualified arrays. Quoting an example from the C99 standard (section §6.7.5.2 Array Declarators):

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 } 

Question in comments

[...] In my main(), the variable I am trying to pass into the function is a double array[][], so how would I pass that into the function? Passing array[0][0] into it gives me incompatible argument type, as does &array and &array[0][0].

In your main(), the variable should be:

double array[10][20]; 

or something faintly similar; maybe

double array[][20] = { { 1.0, 0.0, ... }, ... }; 

You should be able to pass that with code like this:

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; } 

That compiles (to object code) cleanly with GCC 4.2 (i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.9.00)) and also with GCC 4.7.0 on Mac OS X 10.7.3 using the command line:

/usr/bin/gcc -O3 -g -std=c99 -Wall -Wextra -c zzz.c 
like image 68
Jonathan Leffler Avatar answered Sep 19 '22 15:09

Jonathan Leffler