как инициализировать массив union-ов?
От: stuav  
Дата: 02.07.08 09:43
Оценка:
hi all, очень хочется сделать массив юнионов задаваемый в явном виде, но как инициализировать элементы его? как тип при инициализации выбирать компилятор всегда инициализирует првый элемент юниона

typedef struct{
int a;
int b;
}st1;

typedef struct{
char c;
char d;
}st2;

typedef union{
st2 st2o;
st1 st1o;
}un1;


далее....


un1 u1[]={{1,2},{3,4},{5,6},{7,8}}; здесь все элементы проинициализировались как st2, а я хочу выбирать.

компилятор чистый С.
Re: как инициализировать массив union-ов?
От: Bell Россия  
Дата: 02.07.08 09:54
Оценка:
Здравствуйте, stuav, Вы писали:

S>un1 u1[]={{1,2},{3,4},{5,6},{7,8}};   здесь все элементы проинициализировались как st2, а я хочу выбирать.


S>компилятор чистый С.


Это невозможно. С помощью фигурных скобок можно инициализировать только первый элемент объединения.

C99 и C++ позволяют писать вот так:

...

un1 init_st1(int a, int b)
{
   un1 u;
   u.st1o.a = a;
   u.st1o.b = b;

   return u;
}

int main()
{
   un1 u1[] = {{1, 2}, init_st1(3, 4), {3, 4}};

   return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re[2]: как инициализировать массив union-ов?
От: stuav  
Дата: 02.07.08 11:17
Оценка:
очень жаль, программа эта на встроенной системе, это массив в ROM. union здесь удобен для экономии памяти. Видимо прийдётся заводить массив указателей, и отдельно массивы со структурами, потом указатели расставлять.

Здравствуйте, Bell, Вы писали:

B>Здравствуйте, stuav, Вы писали:


B>
S>>un1 u1[]={{1,2},{3,4},{5,6},{7,8}};   здесь все элементы проинициализировались как st2, а я хочу выбирать.
B>


S>>компилятор чистый С.


B>Это невозможно. С помощью фигурных скобок можно инициализировать только первый элемент объединения.


B>C99 и C++ позволяют писать вот так:


B>
B>...

B>un1 init_st1(int a, int b)
B>{
B>   un1 u;
B>   u.st1o.a = a;
B>   u.st1o.b = b;

B>   return u;
B>}

B>int main()
B>{
B>   un1 u1[] = {{1, 2}, init_st1(3, 4), {3, 4}};

B>   return 0;
B>}
B>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.