e155.c

初期化に「{」必要


修正前: struct tag { struct { int x ; int y ; } s[2] ; int unuse ; } ; struct tag R1 = { {100}, /* LOOK */ {200} } ;
修正例 struct tag R2 = { { {100}, {200} } } ;

解説 K&R-Cの構造体初期化の仕様と ANSI-Cの構造体初期化の仕様は、異なります。 この例では、 K&R-Cでも、 ANSI-Cでもコンパイル可能ですが、実行結果が異なります。 実行結果を同じにするには、 ANSI-Cの構造体初期化時『{』を多めに付ける必要があります。 R2の初期化を参考にして下さい。 より、詳細な説明は プログラミング言語C 第2版 ANSI規格準拠 カーニハン リッチー著/石田晴久訳』 「付録A8.7初期化」Page272 を参照して下さい。
応用修正前: typedef unsigned char uint8 ; typedef unsigned int ID ; typedef unsigned short int16 ; typedef struct { int foo ; int bar ; } box_t ; #define KIND1 1 #define KIND2 2 #define KIND3 3 struct { uint8 processName[19]; ID taskID; int16 blockID; box_t Box; } Tbl_1[1024] = { { "P1", 0, KIND1 , 0 }, { "P2", 0, KIND2 , 0 }, { "P3", 0, KIND3, 0 } };
応用修正例: struct { char *processName; /*★1*//*★2*/ ID taskID; int16 blockID; box_t Box; } Tbl_2[/*★3*/] = { { "P1", 0, KIND1, {/*★4*/0} }, { "P2", 0, KIND2, {/*★4*/0} }, { "P3", 0, KIND3, {/*★4*/0} } };

解説: ★1 ascii code のみの文字列を指すならば、uint8 ではなく char * が自然です。 ★2 I/O (ファイル入出力、通信)等をともなわないならば、配列ではなくて ポインタの方がメモリ使用量が少ないです。 ★3 メモリ割付けを強く意識しないのであれば、配列要素数をいちいち書く必要はありません。 ★4 構造体(box_t)にブレスを付けて下さい。