GCC: le type de tableau a un type d'élément incomplet
J'ai déclaré un struct, et j'essaie de passer un tableau de ces structures (ainsi que d'un double tableau de double, et un entier) dans une fonction. Je reçois un message" array type has incomplete element type " de gcc quand je le compile. Qu'est-ce que je me suis trompé dans la façon dont je passe la structure dans la fonction?
typedef struct graph_node {
int X;
int Y;
int active;
} g_node;
void print_graph(g_node graph_node[], double weight[][], int nodes);
J'ai aussi essayé struct g_node graph_node[]
, mais je reçois la même chose.
2 réponses
C'est le tableau qui cause des problèmes dans:
void print_graph(g_node graph_node[], double weight[][], int nodes);
La deuxième et les dimensions suivantes doivent être données:
void print_graph(g_node graph_node[], double weight[][32], int nodes);
, Ou vous pouvez simplement donner un pointeur de pointeur:
void print_graph(g_node graph_node[], double **weight, int nodes);
Cependant, bien qu'ils semblent similaires, ceux-ci sont très différents en interne.
Si vous utilisez C99, vous pouvez utiliser des tableaux à Qualification variable. Citant un exemple de la norme C99 (section §6.7.5.2 déclarateurs de Tableau):
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 dans les commentaires
[...] Dans mon main (), la variable que j'essaie de passer dans la fonction est un
double array[][]
, Alors comment pourrais-je passer cela dans la fonction? Passerarray[0][0]
dedans me donne un type d'argument incompatible, tout comme&array
et&array[0][0]
.
Votre main()
, la variable devrait être:
double array[10][20];
Ou quelque chose de légèrement similaire; peut-être
double array[][20] = { { 1.0, 0.0, ... }, ... };
Vous devriez pouvoir passer cela avec du code comme ceci:
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;
}
Qui compile (en code objet) proprement avec GCC 4.2 (i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (basé sur Apple Inc. build 5658) (LLVM build 2336.9.00)) et aussi avec GCC 4.7.0 sur Mac OS X 10.7.3 en utilisant la ligne de commande:
/usr/bin/gcc -O3 -g -std=c99 -Wall -Wextra -c zzz.c
Le compilateur doit connaître la taille de la deuxième dimension dans votre tableau bidimensionnel. Par exemple:
void print_graph(g_node graph_node[], double weight[][5], int nodes);