• ベストアンサー

構造体メンバへの代入

とても初歩的なことなのですが、 typedef struct _X{ int x; }X[50]; と構造体を定義して X[0].x = 0; と0を代入しようとすると、「宣言が正しく終了していない」とエラーが出てしまいます。 これはなぜでしょうか? ちなみにMicrosoft Visual C++ 2005 Express Editionを使っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • tig33
  • ベストアンサー率50% (6/12)
回答No.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]; とするのと同義です。

mine135
質問者

お礼

回答ありがとうございます。 上手くいきました。 構造体についてまだ知識が不完全だったようです・・・; ありがとうございました。

その他の回答 (3)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> typedef struct _X{ > int x; > }X[50]; この部分は、struct _X[50]型に相当するtypedef名Xを定義したことになります。ですから、 > X[0].x = 0; のXは型名であり、オブジェクトではありませんから、当然エラーになります。 もう一点、問題を指摘しておくと、_Xというのは予約済み識別子ですので、使用すべきではありません。

mine135
質問者

お礼

>もう一点、問題を指摘しておくと、_Xというのは予約済み識別子ですので、使用すべきではありません。 ご指摘ありがとうございました。 今後は気をつけようと思います。

  • ko_kinta
  • ベストアンサー率39% (43/109)
回答No.2

typedefは型名を宣言するための識別子です。 型名に配列の指定はできません。 struct _XをXという型名で宣言する必要があるのならば、その後に改めて引数の宣言をしてください。 Xという型名の必要がないのならば"typedef"を削除するだけです。

参考URL:
http://ysserve.int-univ.com/sugsi/Lecture/c2/e_06-02-04.html
mine135
質問者

お礼

>typedefは型名を宣言するための識別子です。 >型名に配列の指定はできません。 確かにそうですよね。typedefの使い方、間違えないようにします。 回答ありがとうございました。

  • MASA_H
  • ベストアンサー率42% (64/151)
回答No.1

とりあえず、"typedef"を消してみてください。

mine135
質問者

お礼

消してみて上記の皆様の回答を参考にしたところ上手く実行できました。 回答ありがとうございました。

関連するQ&A