Top.Mail.Ru
Уведомления
Очистить все

[Решено] Не получается использовать union в keil v5.

(@igor727)
Level 1

Объединение объявляю , а доступа к внутренним элементам нет.

Цитата
Создатель темы Размещено : 22.07.2023 10:03
(@eduard)
Level 5 Moderator

Код хоть дайте.

ОтветитьЦитата
Размещено : 22.07.2023 11:33
(@igor727)
Level 1

 код в картинке, красным помечена ошибка в keil

Union

 

ОтветитьЦитата
Создатель темы Размещено : 22.07.2023 13:07
(@eduard)
Level 5 Moderator

Лучше вставлять не картинками, а кодом. И давать ошибку.
Да. Эта конструкция не работает и работать не должна.
Почитайте в приложенных файлах.

ОтветитьЦитата
Размещено : 22.07.2023 13:47
(@igor727)
Level 1

@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. Прошу помочь.

ОтветитьЦитата
Создатель темы Размещено : 22.07.2023 14:42
(@eduard)
Level 5 Moderator

В CubeIDE это то же не работает.

Скорее вы заблуждаетесь, что видели полный код, который работает.

То, что я прислал, работает на 146%.

Я этим пользуюсь и проблем не имел.

Ошибка с вашей стороны. И Keil здесь не при чём.

ОтветитьЦитата
Размещено : 22.07.2023 19:45
(@igor727)
Level 1

@eduard  Чтоб, не быть голословным высылаю вам скрин с VS2013 где этот код работает, и скрин с Keil где не работает. Если найдете ошибку, ткните носом. Еще высылаю скрин из help Keil, как авторы объявляют union. Покажите где ошибка.

union2
union3
help

 

ОтветитьЦитата
Создатель темы Размещено : 22.07.2023 20:05
Aveal
(@aveal)
Top level Admin

@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.

 

ОтветитьЦитата
Размещено : 23.07.2023 09:06
(@eduard)
Level 5 Moderator

@igor727 Я же просил не картинками вставлять. Носом тыкать неудобно. Поэтому разберём код от @aveal

От: @aveal

typedef union
{
  int i;
  int j;
} Test;

Test testUnion;

Вот эта часть кода может быть до функции main(), в этом случае она будет глобальной (для файла где находится main(), что бы для всех файлов проекта, там поступают по другому)

Если внутри функции main(), её будет видеть только она.

От: @aveal

testUnion.i = 0;

Должна находится только в функции main(), иначе компилироваться не будет.

По вашим картинкам я не могу понять где стоит объявление union, а где инициализация.

ОтветитьЦитата
Размещено : 23.07.2023 09:50
(@igor727)
Level 1

@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;};
ОтветитьЦитата
Создатель темы Размещено : 23.07.2023 12:26
(@eduard)
Level 5 Moderator
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

От: @igor727

Но как использовать в  разных местах программы смутно понимаю, 

За 5 минут не объяснить.

 

ОтветитьЦитата
Размещено : 23.07.2023 14:28
(@igor727)
Level 1

@eduard Благодарю за помощь и выдержку, все тема закрыта, разобрался. Оказывается при объявлении  переменной  типа union  необходимо в Keil писать:

 тип (union) , имя_типа_объединения(в данном случае Test1, для данного кода), имя переменной. И проблем с union нет, используй где необходимо, все работает.

В обычном VS2013 тип не надо писать. Все благодарю за помощь.

typedef union
  {
      int i;
      int j;
  } Test1;

 union Test1 testUnion1, df;// Это правильное определение переменной


Test1 testUnion1, df;// А это не правильное определение переменной
// Это для Keil
ОтветитьЦитата
Создатель темы Размещено : 23.07.2023 16:09
(@eduard)
Level 5 Moderator

😋 😎 

ОтветитьЦитата
Размещено : 23.07.2023 16:39
Поделиться: