入れ子になっている構造体配列の初期化がうまくいかない

このQ&Aのポイント
  • 入れ子になっている構造体配列の初期化がうまくいかないです。
  • コンパイルするとエラーが発生し、初期化子が多すぎるというエラーメッセージが表示されます。
  • 使用しているOSはWindowsで、コンパイラはBorland C++ Compilerです。
回答を見る
  • ベストアンサー

入れ子になっている構造体配列の初期化がうまくいきません。

入れ子になっている構造体配列の初期化がうまくいきません。 どのようにすればうまくいくでしょうか? #include <stdio.h> typedef struct _item { int no; char name[10]; int price; }ITEM; typedef struct _all_item_info { ITEM ruit[2]; ITEM vegetable[2]; }ALL_ITEM_INFO; ALL_ITEM_INFO all_item_info = { {1, "apple", 100}, {2, "melon", 80}, {3, "tomato", 100}, {4, "radish", 200} }; int main() { ・・・・ } コンパイルすると、以下のようにエラーになってしまいます。 エラー E2225 kouzoutai7.c 20: 初期化子が多すぎる エラー E2141 kouzoutai7.c 22: 宣言の構文エラー エラー E2190 kouzoutai7.c 22: 不要な } エラー E2190 kouzoutai7.c 22: 不要な } OSはwindows、 コンパイラはBorland C++ Compilerです。

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

  • ベストアンサー
回答No.1

VC++ 2008で再現。 普段からC++やってるわけじゃないけど、 一応コンパイル通せた。 こうしろ、ってことでしょ?多分。 ALL_ITEM_INFO all_item_info = { {{1, "apple", 100},{2, "melon", 80}}, /* ruitは0,1までしかないんだから多分4個書いたら誤り*/ {{3, "tomato", 100},{4, "radish", 200}} };

その他の回答 (2)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

#2です。 >どこにも これは語弊がありました。申し訳ありません。 しかし、質問者さんがしたかったことは、#2の回答の とおりではないでしょうか?

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

>入れ子になっている構造体配列の初期化 と書かれているのに、どこにも構造体の配列が見当たりません。 こんな風に書きましょう。 ALL_ITEM_INFO all_item_info[] = { { { 1, "apple", 100 }, { 2, "melon", 80 } }, { { 3, "tomato", 100 }, { 4, "radish", 200 } } };

関連するQ&A

  • 構造体配列の初期化について

    C初心者です。 宜しくお願い致します。 某社のSDKを参考にプログラムを作成しておりますが、構造体配列の初期化する方法がわからなくて困っています。 下記の構造体の初期化をしたいのですが、どのような方法で初期化すればいいかわからない状態です。 すいませんが、ご教授いただきたく宜しくお願い申し上げます。 typedef struct ioctl_videomode { V2U_INT32 width; V2U_INT32 height; V2U_INT32 vfreq; } V2U_PACKED V2U_VideoMode; typedef struct v2u_rect { V2U_INT32 x; V2U_INT32 y; V2U_INT32 width; V2U_INT32 height; } V2U_PACKED V2URect; typedef struct ioctl_grabframe2 { void * pixbuf; V2U_INT32 pixbuflen; V2U_UINT32 palette; V2URect crop; V2U_VideoMode mode; V2U_INT32 imagelen; V2U_INT32 retcode; } V2U_GrabFrame2; typedef struct { V2U_GrabFrame2* frame; char ftime[16]; }frameinfo; void main() { frameinfo fr[512]; //初期化したい →→ fr = (frameinfo*)malloc(sizeof(frameinfo)*512); } error C2106: '=' : 左のオペランドが、左辺値になっていません

  • 入れ子の構造体について

    例えば、入れ子の構造体を1つ使いたい場合、 struct bbb{ int b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; と書くと、「dt.a.b = 10」とやれば、値等を設定できると思いますが、 入れ子の構造体を2つ使いたい場合も、同じように書けるのでしょうか? struct ccc{ int c; }; struct bbb{ struct ccc b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; dt.a.b.c = 10; と書けるのでしょうか?こんがらがってしまって、どう書いていいのか・・。 2つでも出来るのであれば、コードの書き方を教えて頂けませんか?

  • 構造体のメンバが配列の場合の扱い

    typedef struct _info_t{ int xxx; int yyy; int zzz; } info_t; typedef struct _gData{ int aaa;  int bbb; info_t infoData[100]; } gData_t; gData_t gMainData; 質問1 C言語で上記のようなグローバルのデータを作成しようとしています。 gMainDataの中身を初期化するにはどうするのがベストでしょうか? (特にinfoData[100]の初期化) 質問2 gMainData.infoData[XXX]には info_t型のtmpDataを代入しようとしていますが gMainData.infoData[XXX] = tmpData; データがはいっているかどうかはどう判定するべきでしょうか? 質問3 以下のようにポインタを使うのは間違いでしょうか? typedef struct _gData{ int aaa;  int bbb; info_t *infoData[100]; } gData_t; 初期化 memset(gMainData.infoData,NULL, 100); データの代入 *gMainData.infoData[XXX] = tmpData; データの有無判定 if( gMainData.infoData[XXX] == NULL){ }

  • 動的な構造体配列の初期化

    以下のように構造体を new で動的に確保したときに 構造体の中身(char bbb[10], int ccc)をゼロで初期化したいのですが ZeroMemory を使用するとCArrayのAdd()を使用したときにエラーになってしまいました。 何かよい方法がありましたら教えて下さい。お願いいたします。 # 簡単にイメージですが・・・ typedef struct { CString a; CString b; }aaa_t ; struct s_aaa{ char bbb[10]; int ccc; CArray<aaa_t,aaa_t> m_aaaArray ; } s_aaa *StructB; StructB = new s_aaa [10];

  • 構造体の構造体配列初期化

    typedef strunct _test01 { int a; int b; } test01_t; typedef strunct _test { int c; test01_t sTest01[256]; } test_t; test_t sTest; 上記のような構造体がある場合、sTestのメンバのsTest01をNULL初期化する 方法とsTest01に値が入っていないか(初期化されているか)を判定する方法を 教えていただけませんか? よろしくお願い致します。

  • 構造体の初期設定 (C++)

    構造体の初期設定 (C++) C++言語にて以下のコードをコンパイルすると9行目でERROR(E2188 構文エラー)がでます。 【質問】  9行目をどう直せばいいのでしょうか。 -------------------------------------- struct strData{ int a; int *b; }; void main(void) { struct strData *strc; *strc = {5,(int*)6}; /* 9行目 */ } -------------------------------------- 参考書やネットで調べたのですが解説が見つかりませんでしたので。。

  • 多次元配列の構造体の初期化

    タイトル通りです。やり方がわかりません。 構造体変数の初期化や多次元配列の初期化が載ってるページは多いのですが、コレだけは調べても解りませんでした。 typedef struct{ int flag; ~~~~~(略)~~~ }map_t; map_t map[64][64]; の後、map_t型のmap64*64の int flag全てに値を代入したいのですが 詳しいやり方が解りません。 int hensuu[3][3]={   {1,2,3},{4,5,6},{7,8,9} }; 普通の多次元配列みたいにmこんな感じでやりたいんですけど… 初心者でスミマセン。回答いただけたらありがたいです。

  • 構造体の静的な初期化

    構造体の静的な初期化で、初期化が書かれていないメンバーは、 どうなるのでしょうか。。? たとえば・・・ // 構造体の宣言 strcut MY_STRUCT {    int data1 ;    int data2 ;    int data3 ;    int data4 ; } ; // 変数宣言&初期化 static strcut MY_STRUCT st = {    .data1 = 100,    .data3 = 300 } ; ネットで調べると、 初期化で指示されていないメンバーは0に初期化される、 という記述も一つだけ見つけたのですが・・・これはC言語(C99)の仕様でしょうか? それともコンパイラ依存の仕様でしょうか?

  • 構造体の構造体の構造体をまとめて初期化したい

    gnuplotをCで吐くためのプログラムを作成していますが、 構造体の構造体の構造体をまとめて初期化することができません。 以下がコードそのコードです。 #define MAX_PLOT_DATA_NUM 8 #define MAX_GRAPH_SET_NUM 35 //child -------------------------------------------------- typedef struct { char *fileName; int column[2]; char *caption; } Col; //child -------------------------------------------------- typedef struct { char *category; char *subCategory; char *xLabel, *yLabel; char *saveFileName; Col col[MAX_PLOT_DATA_NUM]; } GraphSet; //child -------------------------------------------------- typedef struct { char *lineFormat; int lineWidth; } Common; //mother ------------------------------------------------- typedef struct { GraphSet gs[MAX_GRAPH_SET_NUM]; Common common; } PlotFormats; int main(){ PlotFormats pF = { {"Motor angle","right","Time [s]","Angle [rad]","ang_R", {"motor.dat",1,2,"ang #1 "}, {"motor.dat",1,3,"ang #2 "}, {"motor.dat",1,4,"ang #3 "}, {"motor.dat",1,5,"ang #4 "}, {"motor.dat",1,6,"ang #5 "}, {"motor.dat",1,7,"ang #6 "}, }, //ここから下のコメントアウトしてる部分をはずすとコンパイルが通らなくなります。 //{"Motor angle","left","Time [s]","Angle [rad]","ang_L", // {"motor.dat",1,12,"ang #1 "}, // {"motor.dat",1,13,"ang #2 "}, // {"motor.dat",1,14,"ang #3 "}, // {"motor.dat",1,15,"ang #4 "}, // {"motor.dat",1,16,"ang #5 "}, // {"motor.dat",1,17,"ang #6 "}, //}, {"w l", 5}}; return 0; } エラーは ・間接参照のレベルが 'char *' と 'int' で異なっています。(複数) ・初期化子の数が多すぎます。 と出ます。 長くなりましたが、わかる方がいましたら、よろしくお願いします。

  • 構造体型のポインタ変数を含む構造体

    struct seiseki_tag { Int32 math ; Int32 english ; Int32 science; } ; typedef struct seiseki_tag SEISEKI ; struct personal_tag { Char name ; Int32 num ; SEISEKI *sptr } : typedef struct personal_tag PERSONAL ; struct info_tag { PERSONAL person_info ; } ; typedef struct info_tag INFO ; たとえば、上記のように3つの構造体があり、PERSONAL構造体のメンバーに SEISEKI構造体の型を持つポインタ変数が含まれているような場合で、下記のように INFO型のポインタ変数からSEISEKI構造体のメンバーを参照する方法を教えてください。 PERSONAL構造体メンバーのnameやnumは INFO *info ; info->person_info.name ; info->person_info.num ; のように参照すると思いますが、sptrが示すSEISEKI構造体のメンバーへの アクセスができません。下記のように参照を試みたのですがコンパイルは 通るのですが、実際に参照できていませんでした。 INFO *info ; SEISEKI *seiseki ; seiseki = info->person_info.sptr ; seiseki->math ; 判りにくい説明で申し訳ありませんが、どなたか教えていただければと思います。 よろしくお願いいたします。

専門家に質問してみよう