2

C での構造体の宣言に問題があります。ConnectionNode の配列と接続ノードを持つ NetworkNode を作成する必要があります。これによりエラーが発生することがわかっています。

エラー: フィールド「ターゲット」の型が不完全です

この問題の解決策は何ですか?

ところで。コードは次のとおりです。

struct ConnectionNode
{
    char* name;
    struct NetworkNode target;
};

typedef struct ConnectionNode ConnectionObject;

struct NetworkNode
{
    char* name;
    int i;
    struct ConnectionNode connections[10];
};

typedef struct NetworkNode NetworkObject;
4

3 に答える 3

2

よくわかりませんが、ここでポインターを使用してみて、使用する前に構造体を宣言して前方参照を作成します。NetworkNode構造体へのポインタ(Ex. *target)を追加して、コンパイラがNetworkNode構造体を参照するポインタ用に 2 バイトのメモリを確保するようにします。しかし、宣言するstruct NetworkNode targetと、コンパイラはサイズを認識せず、エラー「不完全な型」をスローします

struct NetworkNode;
struct ConnectionNode
{
    char* name;                      //pointer 2 bytes
    struct NetworkNode *target;      //pointer 2 bytes
};                                  //total 4 bytes reserved

そして、あなたが好きなとき、

struct NetworkNode;
struct ConnectionNode
{
    char* name;                      //pointer 2 bytes
    struct NetworkNode target;       //unknown size of target as it is not YET defined
};                                  //total size: unknown (error: incomplete type)
于 2013-09-09T09:18:15.390 に答える
2

プログラムの最初に、次の前方宣言を追加しますNetworkNode

struct NetworkNode;

これにより、コンパイラは何が何であるかを理解NetworkNodeし、定義でConnectionNode言及する必要があるそのキャッチ22を破ることができNetworkNode、その逆も可能です。

UPDATE : また、 ConnectionNode の定義を変更する必要があります。

...
struct NetworkNode target;
...

代わりにポインタを使用するには:

struct NetworkNode *target;

これがないと、コンパイラは NetworkNode に割り当てるメモリの量を知ることができません (前方宣言があっても)。一方、ポインタは常に同じサイズです。

于 2013-09-09T09:06:50.960 に答える
1

入力すると

struct NetworkNode target;

コンパイラは、ターゲットに十分なメモリを割り当てるために構造体のサイズを知る必要があります。

通常、使用する

struct NetworkNode *target;

別のオブジェクトを (別の malloc で) 参照するには、前方宣言として実行できます。

あなたの宣言の問題は次のとおりです。

struct ConnectionNode {
  struct NetworkNode target;
}
struct NetworkNode {
  struct ConnectionNode connection;
}

つまり、コンパイラは struct NetworkNode 型の 1 つのオブジェクトのサイズを評価できません。

于 2013-09-09T09:20:31.350 に答える