• ベストアンサー

構造体メンバへの代入

とても初歩的なことなのですが、 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

  • 構造体の中の構造体

    typedef struct number{ int x; struct number *next; }Num; 初心者な質問で申し訳ないんですが、構造体の中に構造体があるのはどう解釈していいんでしょうか? typedef struct number{ int x; int y; }Num; の場合はNum a,b;がint a.x,a.y,b.x,b.yとなるのは分かるんですが・・・

  • 構造体メンバ 構造体ポインタ 値代入

    typedef struct _test_t{ int aaa; int bbb; } test_t; typedef struct _globalData{ int xxx; test_t* pTestData[256]; } globalData_t; globalData_t globalData; int main(){ test_t testData1 = {1,1}; test_t testData2 = {2,2}; *globalData.pTestData[1] = testData1; /* (1) */ globalData.pTestData[2] = &testData1; /* (2) */ } 上記のようなグローバルデータの構造体globalData のメンバの構造体配列にtest_t型の構造体を格納し保持するには、 (1)、(2)のどちらが正しいでしょうか?

  • 構造体のメンバ参照について(C言語)

    初めて書き込みする,taroimotenです. 以下のプログラムを作ってみたのですが, メモリ参照エラーが表示され,うまく動きません. アドバイスおねがいします! #include <stdio.h> #include <stdlib.h> // 型宣言. typedef struct data DATA; typedef struct coords COORDS; // 構造体の定義. struct data{ COORDS *pnt[3]; }; struct coords{ float r1; float r2; }; int main(void) { DATA *ptr; DATA x; // ポインタ変数の初期化. ptr = &x; // メンバへの値の代入. ptr->pnt[0]->r1 = 100.0; printf(" r1 : %f \n",ptr->pnt[0]->r1); return EXIT_SUCCESS; }

  • 構造体のあるメンバを基準にソートするには?

    以下のように定義した構造体(下の構造体は入れ子になっている)を必要な時に動的に割り当てた後(デー多数は不定)、たとえば、商品価格を基準に降順、昇順に並び替える機能を追加したいのですが、どのように解決したらよろしいでしょうか? /* 現在の日時を格納する構造体 */ typedef struct time_type{ int year; int month; int day; }time_type; /* 商品の情報を格納する構造体 */ typedef struct shohin_type{ int code; /* 商品コード */ int price; /* 商品価格 */ char *name; /* 商品名 */ int flag; /* フラグ */ struct time_type date; /* 登録日 */ struct shohin_type *before; /* 前の構造体のアドレス */ struct shohin_type *next; /* 次の構造体のアドレス */ }shohin_type;

  • 構造体を型の異なる構造体に代入

    C言語初心者です。 今回の質問は入力された構造体のメンバのデータを型の異なる構造体に代入したいのですが、毎回コンパイラにおこられてしまいます(汗)具体的には typedef struct MSG{ longint type; int flg; int Dt[64]; }t_msg; このDt[64]を以下の構造体に代入します。 typedef struct SC_MSG{ char a; char b; short c; char d; char e; short f; }t_sc_msg; その際、異なる関数で処理するため、 main(){ foo(&t_msg); }; void foo(t_msg *pt_msgdt){ t_sc_msg = (*pt_msgdt+8); ココがエラーになってしまいます。 何か、根本的な間違いをおかしている気がします。 ご指導の方、宜しくお願いします。 ちなみにOSはLinuxでコンパイラーはgccです。

  • 構造体の代入と比較

    構造体のコピーは以下のようで正しいと思いますが、 struct A { int a; }; struct x, y; x.a=1; y = x; 構造体の比較は if (x != y)ではいけないのでしょうか? 構造体に限らずクラスも同じ考えでしょうか?

  • 構造体のメンバーの静的なサイズ取得

    構造体のメンバーをヘッダーファイル中で得たい場合、 以下のような方法以外になにか方法はないでしょうか? 単純に XXXX x;と宣言してそれを sizeof(x.chwk)と 使うというような方法以外で なにかあれば教えてください。 ---------------------------------------- typedef struct { char chwk[100]; } XXXX; typedef struct { char chwk[ sizeof(( (XXXX*)0)->chwk ) ]; } YYYY; main(int arc, char *arg[] ){ YYYY y; printf( " YYYY chwk size = %d\n", sizeof(y.chwk)); }

  • 構造体から他の構造体への代入

    現在C言語で簡単なプログラミングを書いているのですが、 構造体(1)(下記参照)から、構造体(2)(下記参照)への代入の方法がわからず悩んでいます。もしよければ手を貸してください!! 標準関数などがないということはわかったので、 地道に代入を行いたいです。 イメージ・・・(data[n].b = moji[n].d;) (1)struct list_kouzou{ int a; char b[30]; char c[8]; }data[100]; (2)struct list_tai{ char d[30]; }moji[15];

  • 構造体について

    凄く初歩的な質問で申し訳ありませんが… 入門書の構造体のところで 以下のようなプログラムの例がありました。 #include <stdio.h> struct seiseki { /* 構造体の宣言 */ int no; char name[20]; double average; }; int main(void) { int i; struct seiseki seito1, seito2[20]; /* 構造体変数と構造体配列の宣言 */ >char name[20] というのは、NAMEの領域を20文字 確保すると言うことですよね? >struct seiseki seito1, seito2[20] ここの箇所が分からないのですが seito2[20]の20というのは どうして20なのですか? NAMEだけではないので もっと大きな数字になるような気がするのですが… またseito1の方は どうして数字が何もないんですか? 考え違いをしているところを ご指摘して頂ければ幸いです。

  • 構造体のポインタにNULLが入らない

    typedef struct tag{ int number; char name[10]; struct tag *next; }DATA; という構造体があって、 DATA *p; と宣言し、 p->next == NULL; とすることはできないんですか? セグメンテーション違反になってしまうのですが。 pが指すnextにNULLを入れるにはどうしたらいいのでしょうか?

専門家に質問してみよう