web-dev-qa-db-fra.com

GCC: le type de tableau a un type d'élément incomplet

J'ai déclaré une structure et j'essaie de passer un tableau de ces structures (ainsi qu'un double tableau de doubles et un entier) dans une fonction. J'obtiens un message "le type de tableau a un type d'élément incomplet" 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.

28
Joshua Soileau

C'est le tableau qui cause des problèmes dans:

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

La deuxième dimension et les suivantes doivent être indiquées:

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

Ou vous pouvez simplement donner un pointeur à pointeur:

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

Cependant, bien qu'ils se ressemblent, 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 tableaux):

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'essaye de passer dans la fonction est un double array[][], Alors comment pourrais-je le passer dans la fonction? Passer array[0][0] Me donne un type d'argument incompatible, tout comme &array Et &array[0][0].

Dans votre main(), la variable doit ê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 transmettre cela avec un code comme celui-ci:

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 se 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
33
Jonathan Leffler

Le compilateur doit connaître la taille de la deuxième dimension de votre tableau à deux dimensions. Par exemple:

void print_graph(g_node graph_node[], double weight[][5], int nodes);
7
Ed S.