3

これは非常にばかげた質問であり、尋ねてもイライラします。どうか、ご容赦ください。今日は特にこの件について、私は非常に頭がおかしくなっています....

特定の typedef 構造体を持つライブラリがあります。基本的:

typedef struct {int x; int y;} coords;

私が本当にやりたかったのは、ヘッダーで次の可変配列を宣言することでした。

coords MyCoords[];

(私は最近それをちょうどに切り替えてからcoords *MyCoords;実行しましたMyCoords = new coords[4];

そして、初期化でいくつかの値をハードコーディングしたかったのです。

MyCoords[] = {{0, 0}, {2, 2} etc. 

今日はただ頭を悩ませているに違いありません。MyCoords[0] = {0, 0}

上記の構文の一部について申し訳ありません。助けてくれてありがとう。一度にすべての値をハードコーディングすることさえ気にしません。私は今、MyCoords[0] = {0, 0}仕事をするだけで大​​丈夫です。できMyCoords[0].x = 0; MyCoords[0].y = 0ましたが、何が間違っているのかわかりません。どうもありがとう..

4

4 に答える 4

9

配列は、宣言した場所でのみ初期化できます。機能するフォームは次のとおりです。

coords MyCoords[] = {{0, 0}, {2, 2}};

多くのモジュールがアクセスできるようにヘッダーで MyCoords を宣言する必要がある場合は、次のようにするとうまくいくと思います。

extern coords MyCoords[];
于 2009-04-21T16:37:06.567 に答える
5

さて、作成したのは変数配列ではありません。サイズがわからない配列です。その配列は不完全な型を持っているため、C++ では定義できません。あなたができることは、それをextern前に置いて単なる宣言にすることです。

extern coords MyCoords[];

次に、それを初期化する .cpp ファイルで、その配列を作成 (定義) できます。もちろん、関数の外側の名前空間スコープで行う必要があることに注意してください。

coords MyCoords[] = {{1, 2}, {3, 4}, ... };

必要なのは、コンパイル時ではなく実行時にサイズが不明な配列である場合は、次を使用する必要がありますstd::vector

std::vector< coords > MyCoords;

その後、それを埋める場合は、

MyCoords.push_back( coords(1, 2) );
MyCoords.push_back( coords(3, 4) );
....

または、ローカル配列を作成し、その配列の要素のコピーを使用してベクトルを初期化します。

coords c[] = ....;
MyCoords.insert(MyCoords.end(), c, c + sizeof c / sizeof *c);

C では、C++ とは少し異なります。次元が不明な配列を定義できます。何が起こるかというと、それは「暫定的な」定義であると見なされます。ファイルの末尾 (より正確には、そのファイルとそれに含まれるすべてのファイルである翻訳単位の最後) に、サイズを含むそのファイルの後続の定義がない場合、サイズは実寸とさせて頂いております1。ただし、C++ には暫定的な定義がなく、サイズを含まず、サイズを判別できる初期化子を含まない定義は、無効な C++ プログラムです。

あなたのコードがグラジーになる理由のために、あなたはやっています

MyCoords[0] = {0, 0}

コンパイラは次のように読み取ります。

-> Set LHS to RHS
-> -> LHS is a variable of type `coords`. Fine
-> -> RHS is... hmm, `{0, 0}`. What the heck is it??

ご覧のとおり、コンパイラは右辺が何を意味するのか見当がつきません。そのため、C99 (1999 年版の C) では、いわゆる複合リテラルが導入されました。それはあなたが書くことを可能にします

MyCoords[0] = (coords){0, 0};

そして、それは実際にあなたがやりたいことをします - タイプの右側の値を作成し、coordそれを左側に割り当てます。しかし、すでに互換性の理由から (多くの C コンパイラは合理的な C99 準拠ではなく、C++ も C89 も複合リテラルをサポートしていません)、以前に示した方法のいずれかを使用する必要があります。

于 2009-04-21T16:43:48.063 に答える
2

これが実際のコードでも問題になるかどうかはわかりませんが、

typedef struct coords {int x, int y};

は、 typeに名前を付けず、 struct にのみ名前を付けるため、C の完全な typedef 宣言ではありません(struct タグは、標準 C の型名と同じ名前空間にありません)。typedef 宣言を正しくするには、次のstruct coords {int x, int y}ように、その型の変数を宣言しているかのように、型全体の名前を指定する必要があります。

typedef struct coords {int x, int y} coords;
于 2009-04-21T16:48:15.043 に答える
0

そのはず:

typedef struct coords {int x, int y} coords;
coords MyCoords[] = {{0, 0}, {2, 2}, {3, 4}};
于 2009-04-21T17:13:02.317 に答える