On Dec 24, 2009, at 1:40, "Peter Nilsson" <[email protected]> wrote:
> --- In [email protected], Thomas Hruska <thru...@...> wrote: >> bobtransformer wrote: >>> ...I have a char array that is initialized to 128 bytes, say >>> like this... >>> >>> char myarray[128]; >>> >>> Now, sometimes I want to re-use this array for ints and >>> shorts, and I know that it will be good for 64 shorts or >>> 32 int values. > > You're making assumptions about the size of integer types. > Do you need to? > >>> One method that comes to mind is a union, but I'm not >>> sure if that is the best way. > > It is. > >> >> You can reuse the array with typecasting but be sure to >> very carefully document it. You could use a pointer like: >> >> int *myarray_as_int = (int *)myarray; > > The declaration of myarray above is not guaranteed to be > properly aligned for an int. > >> A union would work as well (and perhaps better as your code >> might be more readable): > > It would also be more robust with regard to alignment issues. > >> >> union { >> char as_char[128]; >> short int[64]; >> int as_int[32]; >> } myarray; > > Better still IMO... > > union myarray > { > unsigned char as_char[128]; > short as_short[128 / sizeof(short)]; > int as_int[128 / sizeof(int)]; > } myarray; > > But if you want to read 2 or 4 byte integers, you may be > better off simply reading 2 or 4 bytes from the character > array and constructing the integers. > > -- > Peter I've always ordered unions from the largest sized elements tithe smallest in order to avoid alignment issues -- or, align the entire union on a specific boundary. Is that not necessary? ~Rick Sent from my iPhone
