GCC: il tipo di matrice ha un tipo di elemento incompleto

Ho dichiarato una struct e cerco di passare una matrice di quelle strutture (oltre a una doppia matrice di double e un intero) in una funzione. Ricevo un messaggio di tipo “array ha un tipo di elemento incompleto” da gcc quando lo compilo. Cosa ho sbagliato nel modo in cui passo la struttura nella funzione?

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

Ho anche provato struct g_node graph_node[] , ma ottengo la stessa cosa.

È l’array che causa problemi in:

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

La seconda e le successive dimensioni devono essere date:

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

Oppure puoi semplicemente dare un puntatore al puntatore:

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

Tuttavia, anche se sembrano simili, sono molto diversi internamente.

Se si utilizza C99, è ansible utilizzare matrici con qualifiche variabili. Citando un esempio dello standard C99 (sezione §6.7.5.2 Dichiaratori di array):

 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 } 

Domanda nei commenti

[…] Nel mio main (), la variabile che sto cercando di passare alla funzione è un double array[][] , quindi come dovrei passare alla funzione? Passare l’ array[0][0] in esso mi dà tipo di argomento incompatibile, così come &array e &array[0][0] .

Nella tua main() , la variabile dovrebbe essere:

 double array[10][20]; 

o qualcosa di vagamente simile; può essere

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

Dovresti essere in grado di passarlo con un codice come questo:

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

Che compila (al codice object) in modo pulito con GCC 4.2 (i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (basato su Apple Inc. build 5658) (LLVM build 2336.9.00)) e anche con GCC 4.7.0 su Mac OS X 10.7.3 utilizzando la riga di comando:

 /usr/bin/gcc -O3 -g -std=c99 -Wall -Wextra -c zzz.c 

Il compilatore deve conoscere la dimensione della seconda dimensione nell’array bidimensionale. Per esempio:

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