1. ホーム
  2. arrays

[解決済み】GCC: 配列の型が不完全な要素型である

2022-03-11 12:35:59

質問

を宣言しました。 struct という構造体の配列を渡そうとします。 double の配列、および整数を含む)を関数に渡すことができます。このとき 配列の型は不完全な要素型です。 というメッセージが表示されます。を渡す方法が間違っていたのでしょうか? struct を関数に渡すことができますか?

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[] しかし、私は同じことを得る。

解決方法を教えてください。

で問題が発生しているのは配列です。

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

2次元目以降を指定する必要があります。

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 Array Declarators)から例を引用してみましょう。

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 (Based on Apple Inc. build 5658) (LLVM build 2336.9.00)) と Mac OS X 10.7.3 上の GCC 4.7.0 でコマンドラインを使ってきれいに(オブジェクトコードに)変換されました.

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