0

コードで2つのタイプを定義しました。

typedef struct Project Project;

typedef struct Worker{
  Project projects[10];
}Worker;

struct Project{
 Worker member[30];
}

コンパイルプロセスで次のエラーがスローされます。

配列型の要素型が不完全です

循環参照が原因だと思います。コンパイラが配列にスペースを割り当てようとすると、Project型がわからず、型の定義順序を変更しても同じことが起こります。私はその問題について正しいですか?そして最も重要なのは、どうすればこの問題を解決できますか?

4

3 に答える 3

2

コメントで述べたように、両方の構造体型は他の型へのポインターを保持する必要があります。Project現状では、構造体と構造体の両方Workerが無限に大きくなければなりません。それぞれWorkerに 10 個Projectの s が含まれ、これには 30個の s が含まれるWorkerなどです。

于 2012-10-20T18:40:04.663 に答える
2

あなたは正しいです。Worker 構造体には、型 Project のメンバーが値で含まれています。コンパイラが Worker オブジェクトを正しく構築するには、そのサイズを知る必要があります。これは、Project タイプの完全な定義が必要であることを意味します。コードでは、数行後に定義されています。これを回避するには、ワーカー構造体のプロジェクト メンバーへの参照/ポインターを使用し、前方宣言を使用してそれをアナウンスして、コンパイラーが既知の型であることを認識できるようにします (ポインターのサイズは型に依存しないため、上記の問題は回避されます)。したがって、コンパイラは完全な型定義を必要としません)。

このようなもの:

struct Project;  //forward declaration of Project type
typedef struct Worker{
  Project *projects[10];
} Worker;

struct Project{
  Worker member[30];
}
于 2012-10-20T18:46:32.963 に答える
1

タイプ の配列を宣言する場合Project、コンパイラは を定義するために定義を知る必要がありますWorker。の前方宣言ではProject、コンパイラに の存在を通知するだけですが、コンパイラProjectは完全な定義を知る必要があります。代わりにポインターを宣言して実行できますmalloc

typedef struct Project Project;

typedef struct Worker{
  Project *projects;
}Worker;

struct Project{
 Worker *member;
};

補足: 構造体定義にセミコロンがありません:

struct Project{
 Worker member[30];
};
于 2012-10-20T18:42:07.117 に答える