schmidt@ics.uci.edu (Doug Schmidt) (06/07/89)
Hi, I've got a quick C question. The following program gives different results depending on whether it is compiled with GCC 1.35 or Sun OS 4.0.1's cc compiler (if -DFIXBUG is defined when compiling they produce the same result). The only difference is the absence of surrounding '{' '}' to demarcate each row in the initializer for the two dimensional array `bar.' Can someone please tell me which version is *correct* w.r.t. 1. The latest ANSI-C draft. 2. Traditional behavior on UNIX compilers. thanks very much, Doug ---------------------------------------- typedef struct { int i; int j; } bar; #ifndef FIXBUG static bar foo[4][4] = { {1,0}, {2,0}, {3,0}, {4,0}, {5,0}, {6,0}, {7,0}, {8,0}, {9,0}, {10,0}, {11,0}, {12,0}, {13,0}, {14,0}, {15,0}, {16,0}, }; #else static bar foo[4][4] = { /* Note the extra { } for each row... */ { {1,0}, {2,0}, {3,0}, {4,0},}, { {5,0}, {6,0}, {7,0}, {8,0},}, { {9,0}, {10,0}, {11,0}, {12,0},}, {{13,0}, {14,0}, {15,0}, {16,0},}, }; #endif main () { int i,j; for (i = 0;i < 4; i++) { for (j = 0; j < 4; j++) printf ("%4d", foo[i][j].i); printf ("\n"); } } -- Any man's death diminishes me, | schmidt@ics.uci.edu (ARPA) Because I am involved in Mankind; | office: (714) 856-4043 And therefore never send to know for whom the bell tolls; It tolls for thee -- John Donne
dan@oresoft.uu.net (Daniel Elbaum) (06/13/89)
In <16984@paris.ics.uci.edu> Doug Schmidt <schmidt@zola.ics.uci.edu> asks why I. static bar foo[4][4] = { {1,0}, {2,0}, {3,0}, {4,0}, {5,0}, {6,0}, {7,0}, {8,0}, {9,0}, {10,0}, {11,0}, {12,0}, {13,0}, {14,0}, {15,0}, {16,0}, }; isn't the same as II. static bar foo[4][4] = { { {1,0}, {2,0}, {3,0}, {4,0},}, { {5,0}, {6,0}, {7,0}, {8,0},}, { {9,0}, {10,0}, {11,0}, {12,0},}, {{13,0}, {14,0}, {15,0}, {16,0},}, }; according the the latest pANSI draft and traditional UNIX C compilers. dpANSI says that the bracketing of the initialization in I requires assigning 1 to foo[0][0].i, 0 to foo[0][1].i, 2 to foo[1][0].i, 0 to foo[1][1].i, etc., since each enclosed left bracket specifies that the next nested member is to be given the following value. In other words, {2,0} says "give 2 to the first element of the next foo," which means to assign to the first element of the next array of bar. -- The workaday world must remain transparent to those who maintain it if they are to find inspired within them a vision of the history they create. ({uunet,tektronix,reed,sun!nosun,osu-cis,psu-cs}!oresoft!(dan)@oresoft.uu.net)