プロが教える店舗&オフィスのセキュリティ対策術

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' で異なっています。(複数)
・初期化子の数が多すぎます。
と出ます。

長くなりましたが、わかる方がいましたら、よろしくお願いします。

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

コンパイラのエラーが示すとおり、
構造体への参照レベルが違っていたみたいですね…

本当にありがとうございました。
非常に助かりました。

お礼日時:2009/06/12 10:59

#2です。


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

こういったことがしたいのでしょうか?


配列を使えばよいです。


#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;
}
    • good
    • 0

あまり自信はありませんが、予想では



#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

でどうでしょうか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!