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.

22
demandé sur Joshua Soileau 2012-04-04 04:15:08

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? Passer array[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
27
répondu Jonathan Leffler 2012-04-04 01:02:03

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);
5
répondu Ed S. 2012-04-04 00:36:58