- ベストアンサー
構造体の構造体の構造体をまとめて初期化したい
- gnuplotをCで吐くためのプログラムを作成していますが、構造体の構造体の構造体をまとめて初期化することができません。
- 以下に示すコードで、構造体の初期化の際にエラーが発生しています: ・間接参照のレベルが 'char *' と 'int' で異なっています。(複数) ・初期化子の数が多すぎます。
- 問題の原因は、構造体の構造体であるGraphSet内のCol構造体の初期化が正しく行われていないためです。解決方法としては、Col構造体についても必要なメンバを指定して初期化する必要があります。
- みんなの回答 (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; }
その他の回答 (3)
- asuncion
- ベストアンサー率33% (2127/6289)
#2です。 先ほどの解答には誤りがありました。 いったん取り消します。 申し訳ありません。
- asuncion
- ベストアンサー率33% (2127/6289)
こういったことがしたいのでしょうか? 配列を使えばよいです。 #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)
あまり自信はありませんが、予想では #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 でどうでしょうか。
お礼
コンパイラのエラーが示すとおり、 構造体への参照レベルが違っていたみたいですね… 本当にありがとうございました。 非常に助かりました。