Объединение объявляю , а доступа к внутренним элементам нет.
Код хоть дайте.
код в картинке, красным помечена ошибка в keil
Лучше вставлять не картинками, а кодом. И давать ошибку.
Да. Эта конструкция не работает и работать не должна.
Почитайте в приложенных файлах.
@eduard Вот код рабочий, из проекта в VS2013, union { int k,l; }D1;
D1.k = 0; он в Keil не работает, а VS2013 работает прекрасно а то, что привел ранее объявление union взято из help keil, там объявлено именно так, но как использовать в keil не понимаю. Можно просто привести пример для keil правильное объявление union и его использование, то что вы выслали не работает. В VS никогда проблем не возникало, а вот в Keil не работает. Код ошибки : error: #40: expected an identifier. Прошу помочь.
В CubeIDE это то же не работает.
Скорее вы заблуждаетесь, что видели полный код, который работает.
То, что я прислал, работает на 146%.
Я этим пользуюсь и проблем не имел.
Ошибка с вашей стороны. И Keil здесь не при чём.
@eduard Чтоб, не быть голословным высылаю вам скрин с VS2013 где этот код работает, и скрин с Keil где не работает. Если найдете ошибку, ткните носом. Еще высылаю скрин из help Keil, как авторы объявляют union. Покажите где ошибка.
@igor727 Доброго времени суток:
typedef union { int i; int j; } Test; Test testUnion; testUnion.i = 0;
union Test { int i; int j; }; union Test testUnion; testUnion.i = 0;
Так тоже не компилируется? Без #pragma anon_unions.
@igor727 Я же просил не картинками вставлять. Носом тыкать неудобно. Поэтому разберём код от @aveal
typedef union
{
int i;
int j;
} Test;Test testUnion;
Вот эта часть кода может быть до функции main(), в этом случае она будет глобальной (для файла где находится main(), что бы для всех файлов проекта, там поступают по другому)
Если внутри функции main(), её будет видеть только она.
testUnion.i = 0;
Должна находится только в функции main(), иначе компилироваться не будет.
По вашим картинкам я не могу понять где стоит объявление union, а где инициализация.
@aveal Да тоже не компилируется, если посмотрите на картинки строка 123-127 объявление union и инициализация,
мне нужно чтоб хоть внутри функции main заработала, а дальше разберусь. Дело в том, что только начинаю учиться программировать на С. Вчера получилось объявить union и получить доступ к нему код :->
Но как использовать в разных местах программы смутно понимаю, толи надо использовать по ссылке(указателю), или искать другие атрибуты.
typedef union __attribute__ ((transparent_union)) { int s; // signed unsigned int u; // unsigned unsigned char b[sizeof(int)]; // bytes } integer_t; void gooo(integer_t b) { b.s=0;};
typedef union { int i; int j; } Test1; Test1 testUnion1; union Test2 { int i; int j; }; union Test2 testUnion2; int main(void) { SystemClock_Config(Quartz_8); testUnion1.i = 0; testUnion2.i = 0; while (1) { } }
Как видите ошибок 0
Но как использовать в разных местах программы смутно понимаю,
За 5 минут не объяснить.
@eduard Благодарю за помощь и выдержку, все тема закрыта, разобрался. Оказывается при объявлении переменной типа union необходимо в Keil писать:
тип (union) , имя_типа_объединения(в данном случае Test1, для данного кода), имя переменной. И проблем с union нет, используй где необходимо, все работает.
В обычном VS2013 тип не надо писать. Все благодарю за помощь.
typedef union { int i; int j; } Test1; union Test1 testUnion1, df;// Это правильное определение переменной Test1 testUnion1, df;// А это не правильное определение переменной // Это для Keil
😋 😎