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

このQ&Aのポイント
  • gnuplotをCで吐くためのプログラムを作成していますが、構造体の構造体の構造体をまとめて初期化することができません。
  • 以下に示すコードで、構造体の初期化の際にエラーが発生しています: ・間接参照のレベルが 'char *' と 'int' で異なっています。(複数) ・初期化子の数が多すぎます。
  • 問題の原因は、構造体の構造体であるGraphSet内のCol構造体の初期化が正しく行われていないためです。解決方法としては、Col構造体についても必要なメンバを指定して初期化する必要があります。
回答を見る
  • ベストアンサー

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

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' で異なっています。(複数) ・初期化子の数が多すぎます。 と出ます。 長くなりましたが、わかる方がいましたら、よろしくお願いします。

  • carcl
  • お礼率34% (9/26)

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

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

こんなことかな? #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(void) { PlotFormats pF = { { { "category", "subCategory", "xLabel", "yLabel", "saveFilename", { { "fileName", 10, 20, "caption", }, { "fileName", 10, 20, "caption", }, { "fileName", 10, 20, "caption", }, }, }, { "category", "subCategory", "xLabel", "yLabel", "saveFilename", { { "fileName", 10, 20, "caption", }, { "fileName", 10, 20, "caption", }, }, }, { "category", "subCategory", "xLabel", "yLabel", "saveFilename", { { "fileName", 10, 20, "caption", }, { "fileName", 10, 20, "caption", }, { "fileName", 10, 20, "caption", }, { "fileName", 10, 20, "caption", }, }, }, }, "lineFormat", 30, }; return 0; }

carcl
質問者

お礼

コンパイラのエラーが示すとおり、 構造体への参照レベルが違っていたみたいですね… 本当にありがとうございました。 非常に助かりました。

その他の回答 (3)

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

#2です。 先ほどの解答には誤りがありました。 いったん取り消します。 申し訳ありません。

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

こういったことがしたいのでしょうか? 配列を使えばよいです。 #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(void) { PlotFormats pF[2] = { { "category", "subCategory", "xLabel", "yLabel", "saveFilename", "fileName", 10, 20, "caption", "lineFormat", 30, }, { "category", "subCategory", "xLabel", "yLabel", "saveFilename", "fileName", 1000, 2000, "caption", "lineFormat", 3000, }, }; return 0; }

  • Interest
  • ベストアンサー率31% (207/659)
回答No.1

あまり自信はありませんが、予想では #define MAX_PLOT_DATA_NUM 8 に対して、 {"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 "}, }, これでは col の要素が6つしかないので、その後のコメントアウトしてある部分を入れようとすると要素の数が合わないのが露呈してしまうのではないでしょうか。 そう仮定してこの構造体がメモリ上に展開された状態をイメージすると、 //ここから下のコメントアウトしてる部分をはずすとコンパイルが通らなくなります。 //{"Motor angle","left","Time [s]","Angle [rad]","ang_L", と書かれた2番目の要素 "left" の位置は本来ならば int column[2] の場所なので、「間接参照のレベルが 'char *' と 'int' で異なっています。」というエラーメッセージが出ているのだと思います。 解決策ですが、単純に #define MAX_PLOT_DATA_NUM 6 でどうでしょうか。

関連するQ&A

  • 構造体についてです。

    typedef struct student{ int id; char name[20]; int kokugo; int sansu; int eigo; }STUDENT; と、 struct student{ int id; char name[20]; int kokugo; int sansu; int eigo; }; の違いはなんでしょう? 私は下記をよく使うのですが・・・。 typedefについて詳しく知りたいです。

  • 構造体の中の構造体

    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 Day{  int day1, day2, day3; } Day; このような関数で値を入れて、 int DayTest (char s) {  Day day;  day1 = 2003;  day2 = 12;  dat3 = 31;  return < ここの返し方がわからない >; } これを main() 関数で参照できるようにするには どうすればいいのでしょうか。 printf で出力させるとかで結構です。 ポインタだとは思うのですが、うまくいきません。

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

    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 ; 判りにくい説明で申し訳ありませんが、どなたか教えていただければと思います。 よろしくお願いいたします。

  • 自己参照型構造体のFree関数について

    /////////////////////////////////////// // 自己参照型構造体 /////////////////////////////////////// // 以下のソースで、free関数がうまく使えません。 // アドバイスを下さい。 // よろしくお願いします。 #include<iostream> using namespace std; struct data { int num; data *next; }; typedef struct data dat; int main() { dat da; dat *p1,*p2,*p3; p1=&da;p2=&da; for(int i=0;i<10;i++) { p1->next=(dat *)malloc(sizeof(dat));; p1->num=i+1; p1=p1->next; } int sum=0; for(int i=0;i<10;i++) { sum+=p2->num; p2=p2->next; } for(int i=0;i<10;i++) { p3=p2->next; free(p2); p2=p3; } cout << sum; getchar();return 0;

  • 構造体のアライメント調整

    構造体のアライメント調整について教えて下さい。 (1) アライメント調整を行う目的は何ですか? (2) char = 1byte short = 2byte int = 4byteの時、 下の構造体にアライメント調整を行うとすれば、どうすればいいでしょうか? typedef struct{ ____char hoge1 ____char hoge2 ____short hoge3 ____char hoge4 ____int hoge5 ____int hoge6 ____char hoge7 }tHOGEHOGE 下の形になるかなぁと思っているのですが、本当に(1)~(4)まで全部必要でしょうか? typedef struct{ ____char hoge1 ____char hoge2 (1)__char reserve[2] ____short hoge3 (2)__char reserve[2] ____char hoge4 (3)__char reserve[3] ____int hoge5 ____int hoge6 ____char hoge7 (4)__char reserve[3] }tHOGEHOGE つまらない質問で申し訳ありませんが、 よろしくお願いいたします。

  • 異なる構造体のデータのコピー

    (1)で受け取った構造体のメンバのデータを (2)の構造体のメンバにコピーしたいと考えています。 (1) typedef struct _recvData{ int data01; int data02; char data03; char data 04; char data05; char data 06; char data07; char data08; char data09; char data10; char array01[16]; char array02[16]; } recvData; (2) typedef struct _sendData{ int header; int data01; int data02; char data03; char data 04; char data05; char data 06; char data07; char data08; char data09; char data10; int array01[4]; int array02[4]; } sendData; そこで2点ほどおしえていただきたく、お願い致します。 (1)構造体が微妙に異なるため、各メンバ変数に値をそれぞれ代入していくしか方法がないのでしょうか? (2)array01, array02はデータの型が異なる場合、データのコピーはどのようにしたらよいでしょうか?

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

    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: '=' : 左のオペランドが、左辺値になっていません

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

    以下のように構造体を 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 struct num{ char rv[1000]; struct number *next; struct number *prev; }Num; このような双方向のリスト構造に void aplist(Num **s,char ns[]){ Num *old, *new; if(*s==NULL){ *s = (Num *)malloc(sizeof(Num)*1); strcpy((*s)->rv,ns); (*s)->next = NULL; (*s)->ago = NULL; return;} old= (*s); while(old->next != NULL){ old = old->next;} new = (Num *)malloc(sizeof(Num)*1); strcpy(new->rv,ns); new->next = NULL; old->next = new; new->prev = old; 関数の中でこのようにnext,oldを指定していったのですが、これでよいでしょうか?また、このリストを逆方向(prevの方向)に表示していきたいのですがどのように書けばよいでしょうか?nsは1行の文字列で、各構造体に1行ずつ入れていっています。

専門家に質問してみよう