25

Вопрос по struct, gcc, c, arrays – GCC: тип массива имеет неполный тип элемента

Я объявил структуру, и я пытаюсь передать массив этих структур (а также двойной массив значений типа double и целое число) в функцию. Я получаю & quot; тип массива имеет неполный тип элемента & quot; сообщение от gcc, когда я его компилирую. Что я ошибся в том, как передать структуру в функцию?

typedef struct graph_node {
  int X;
  int Y;
  int active;
} g_node;

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

Я также пыталсяstruct g_node graph_node[], но я получаю то же самое.

  • Error: User Rate Limit Exceededdouble weight[][10]Error: User Rate Limit Exceededdouble (*weight)[10]Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от Joshua Soileau
  • Error: User Rate Limit Exceeded

    от Joshua Soileau
  • 30

    Это массив, который вызывает проблемы в:

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

    Второе и последующие измерения должны быть заданы:

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

    Или вы можете просто дать указатель на указатель:

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

    Однако, хотя они выглядят одинаково, они очень разные внутри.

    Если вы используете C99, вы можете использовать массивы различной квалификации. Цитируем пример из стандарта C99 (раздел & # xA7; 6.7.5.2 Деклараторы массивов):

    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].

    В вашемmain()переменная должна быть:

    double array[10][20];
    

    или что-то слегка похожее; может быть

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

    Вы должны быть в состоянии передать это с кодом, подобным этому:

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

    Это компилируется (в объектный код) чисто с GCC 4.2 (i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (на основе Apple Inc. сборка 5658) (сборка LLVM 2336.9.00)), а также с GCC 4.7.0 в Mac OS X 10.7.3 с использованием командной строки:

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

  • 6

    Компилятор должен знать размер второго измерения в вашем двумерном мас

    сиве. Например:

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