Path: utzoo!utgpu!jarvis.csri.toronto.edu!cs.utexas.edu!usc!apple!bionet!ames!pacbell!pb2esac!pttesac!jeapedai From: jeapedai@pttesac.UUCP (J. E. Apedaile) Newsgroups: comp.lang.c Subject: structure initialization Message-ID: <1515@pttesac.UUCP> Date: 23 Jan 90 00:31:38 GMT Organization: Pacific*Bell ESAC, San Francisco, Ca. Lines: 81 The example code that follows compiles correctly and prints the right values when executed on SunOS 4.0.3 and on a UNIX-PC OS 3.5 (SVR2.?). The code that this was taken from also compiled without error on an AT&T SVR2.2 compiler. Gcc on the UNIX-PC gives the following warning and output: jim 57 > gcc e.c e.c: In function main: e.c:21: warning: excess elements in aggregate initializer jim 58 > a.out 40, cf000, ff000 0, 0, 0 0, 0, 0 0, 0, 0 0, 0, 0 The code fails to compile at all on an a AT&T 3B20S SVR3.1 or a AT&T 3B4000 SVR3.1.5 and gives the following error output: cc e.c "e.c", line 17: too many struct initializers "e.c", line 17: too many initializers; missing } ? "e.c", line 17: operands of = have incompatible types "e.c", line 17: cannot recover from earlier errors: goodbye! Lint does not complain on any of these systems. The AT&T compiler and gcc will both compile with out errors if the five sets of braces surrounding each group of three items in the initialization are removed. A quick look through K&R1 did not find anything which would lead me to believe that the code as written is wrong. It seems to me that forcing the initialization to be 1 group of 15 items instead of 5 groups of 3 items does not make code maintenance easier but harder, especially if the structure definition and typedef are in a header file. Why is this no longer allowed? Any comments? Jim Apedaile Work: (415) 545-8300 WORK UUCP: {att,bellcore,sun,ames,pyramid}!pacbell!pttesac!jeapedai HOME UUCP: {att,bellcore,sun,ames,pyramid}!pacbell!pttesac!clab!jim ----------------------------- CUT HERE -------------------------- struct exp1 { int length; long grp1; long grp2; }; typedef struct { struct exp1 blk[5]; } RANGE; main() { static RANGE example = { { 40, 0xcf000, 0xff000 }, { 50, 0x1cf000, 0x1ff000 }, { 60, 0x2cf000, 0x2ff000 }, { 70, 0x3cf000, 0x3ff000 }, { 80, 0x4cf000, 0x4ff000 }, }; register RANGE *rptr; register int i; rptr = &example; for ( i = 0; i < 5; i++) (void)printf("%d, %lx, %lx\n", rptr->blk[i].length, rptr->blk[i].grp1, rptr->blk[i].grp2); return(0); } -- Jim Apedaile Work: (415) 545-8300 WORK UUCP: {att,bellcore,sun,ames,pyramid}!pacbell!pttesac!jeapedai HOME UUCP: {att,bellcore,sun,ames,pyramid}!pacbell!pttesac!clab!jim