[comp.lang.c] Initializers for multi-dimensional arrays

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)