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, а я хочу выбирать.
компилятор чистый С.
Здравствуйте, 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;
}
очень жаль, программа эта на встроенной системе, это массив в 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>