0

初期サイズを持たない構造体の配列を使用しようとすると問題が発生します。どうすればよいですか?これは私の構造です:

struct carbon {
    double temp;
    double mass;
    rowvec::fixed<3> position;      
    rowvec::fixed<3> velocity;
    rowvec::fixed<3> force;
} *atom;

私のプログラムでは、次のように構造体配列のサイズを割り当てています。

  atom = new carbon[PARTICLE_NUM];

問題は、この構造体を他のファイルでどのように使用するかです。ヘッダーファイルを作成して入れました

extern struct carbon *atom;

しかし、次のエラーが発生します。

setup_pos.cpp:19: error: invalid use of incomplete type ‘struct carbon’
system_setup_distances.h:18: error: forward declaration of ‘struct carbon’

グローバル変数を使用するべきではないことはわかっていますが、最初にこれをテストしたいと思います。助けてくれてありがとう。

4

4 に答える 4

1

構造体の定義はヘッダーファイルにある必要があります。

于 2012-02-19T15:48:26.547 に答える
1

構造体の定義をcarbonヘッダーファイルにインクルードしてから、そのヘッダーファイルをfiles(.hまたは.cpp)にインクルードする必要があります。このファイルでは、これらの不完全なタイプのエラーが発生します。

なぜエラーですか?
前方宣言を使用する場合は常に、その型はコンパイラの不完全な型になります。これは、前方宣言されたエンティティがデータ型であることだけをコンパイラが認識しているが、レイアウトやその内部については何も知らないためです。コンパイラが型レイアウトを必要とする操作は、エラーで文句を言います。

あなたの場合、コンパイラは十分なメモリを割り当てるために構造のサイズを知る必要がcarbonありますが、それは前方宣言型であるため、エラーで文句を言うのでできません。

于 2012-02-19T15:48:36.507 に答える
1

使用するソースファイルには、構造atomの完全な定義が必要です。carbon

次のように、構造を外部と一緒に同じヘッダーファイルに配置します。

struct carbon {
    double temp;
    double mass;
    rowvec::fixed<3> position;      
    rowvec::fixed<3> velocity;
    rowvec::fixed<3> force;
};

extern struct carbon *atom;

atomソースファイルの1つで変数を定義します。

struct carbon *atom = 0;

これで、にアクセスする必要があるときはいつでもatom、構造体とextern宣言があるヘッダーファイルをインクルードすると、機能するはずです。

PS。グローバル名前空間に変数を含める代わりに、atomそれを独自の名前空間に置くことができます。

namespace some_clever_name
{
    struct carbon { ... };
    extern carbon *atom;
}

そしてこれをソースファイルに入れます:

some_clever_name::carbon *some_clever_name::atom = 0;
于 2012-02-19T15:51:26.370 に答える
0

他の回答が言うように、ヘッダーファイルに構造体の定義を含める必要があります。しかし、なぜこれが必要なのか自問してみましょう。

C ++は最初からCに基づいており、Cから単純なコンパイル戦略を継承しています。コンパイラーは1つのパスを作成し、コンパイラーもリンカーも、提示されたファイル以外のものにアクセスする必要はありません。CとUNIXが最初に開発されたとき、アドレススペースは限られており、プロセッサはほとんどの人が想像できるよりも低速でした。私のKindle Fireは、90年代まで使用していたものよりもかなり大きなコンピュータです。

PL / I(Cの祖先の1つ)のように複雑なスキームを使用する代わりに、コンパイラーを単純化していたため、プリプロセッサーを構築し、インクルード・ファイルを使用しました。コンパイラは、コードを生成できるように構造体の「形状」を知る必要があります。たとえば、アクセスする場合massは、構造体の先頭からのオフセットを知る必要があります。したがって、CおよびC ++では、その「形状」の説明をテキストで含める必要があります。

于 2012-02-19T15:55:37.513 に答える