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)にブレスを付けて下さい。