Подтвердить что ты не робот

GCC: тип массива имеет неполный тип элемента

Я объявил структуру, и я пытаюсь передать массив этих структур (а также двойной массив удвоений и целое число) в функцию. Я получаю сообщение "тип массива с неполным типом элемента" из 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[], но я получаю то же самое.

4b9b3361

Ответ 1

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

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 (раздел §6.7.5.2 Declarators 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
}

Вопрос в комментариях

[...] В моей main() переменная, которую я пытаюсь передать в функцию, является double array[][], поэтому как бы передать ее в функцию? Передача array[0][0] в него дает мне несовместимый тип аргумента, как и &array и &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. build 5658) (LLVM build 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

Ответ 2

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

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