- ベストアンサー
構造体メンバへの代入
とても初歩的なことなのですが、 typedef struct _X{ int x; }X[50]; と構造体を定義して X[0].x = 0; と0を代入しようとすると、「宣言が正しく終了していない」とエラーが出てしまいます。 これはなぜでしょうか? ちなみにMicrosoft Visual C++ 2005 Express Editionを使っています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> typedef struct _X{ > int x; > }X[50]; これは、目的と違った宣言になっています。 回答の2,3の方の言うとおりです。 typedefを使いたいのであれば、 typedef struct { int x; } INTX; INTX X[50]; 代入は、 X[0].x=0; と記述してもOKです。 typedefは、新しい型を宣言する場合に使います。 ここでは、INTXという新しい型を宣言しています。 typedefを使わない方法なら struct { int x; } X[50]; これで、X[0].x=0; と記述できます。 ここでは、構造体に名前をつけていませんが、つけることもできます。 struct IX { int x; } X[50]; これは、 struct IX { int x; }; struct IX X[50]; とするのと同義です。
その他の回答 (3)
- jacta
- ベストアンサー率26% (845/3158)
> typedef struct _X{ > int x; > }X[50]; この部分は、struct _X[50]型に相当するtypedef名Xを定義したことになります。ですから、 > X[0].x = 0; のXは型名であり、オブジェクトではありませんから、当然エラーになります。 もう一点、問題を指摘しておくと、_Xというのは予約済み識別子ですので、使用すべきではありません。
お礼
>もう一点、問題を指摘しておくと、_Xというのは予約済み識別子ですので、使用すべきではありません。 ご指摘ありがとうございました。 今後は気をつけようと思います。
- ko_kinta
- ベストアンサー率39% (43/109)
typedefは型名を宣言するための識別子です。 型名に配列の指定はできません。 struct _XをXという型名で宣言する必要があるのならば、その後に改めて引数の宣言をしてください。 Xという型名の必要がないのならば"typedef"を削除するだけです。
お礼
>typedefは型名を宣言するための識別子です。 >型名に配列の指定はできません。 確かにそうですよね。typedefの使い方、間違えないようにします。 回答ありがとうございました。
- MASA_H
- ベストアンサー率42% (64/151)
とりあえず、"typedef"を消してみてください。
お礼
消してみて上記の皆様の回答を参考にしたところ上手く実行できました。 回答ありがとうございました。
お礼
回答ありがとうございます。 上手くいきました。 構造体についてまだ知識が不完全だったようです・・・; ありがとうございました。