Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Re: Котуинко

Чт мар 04, 2021 12:49:14

на просторах есть обрезанный образ вин10х64, называется "tiny10 b4 x64.iso". Памяти после загрузки 447мб занимает, на винте около 3Гб, процессов в диспетчере задач - всего 32. Пробовал на слабом ноутбуке - вполне норм. шевелится, VSCode там работал, а новая ардуино ИДЕ на такой же основе. Правда интерфейс английский, но мы ж программисты - народ мясистый, если Си и ассемблер знаем - значит и английский знаем.

Re: Котуинко

Чт мар 04, 2021 12:53:14

То ужшшш лучше подождать до обновления системника - все равно когда-то да придется тратиться...
:sleep:

Re: Котуинко

Пт мар 05, 2021 11:47:50

Как-то уже пережевывали с ARV тему UNION...
Однако глянул вот тут
https://radiokot.ru/forum/viewtopic.php ... 0#p3990790
Да решил под адуринку проверить... (а заодно посмотреть куда выравнивает вомпилятор - к старшим или к младшим байтам)...
То все теория "как разместить?" а кусманчика "как применить" и нету...
Тем более, что симулятор (UnoArduSim 2.9.1) подобную конструкцию не понимает...
Получился вот такой тестик симпатяшный:
Спойлер
Код:
union {
  long my_long;
  struct
   {
    unsigned int my_int1;
    unsigned int my_int2;
   };
  struct
   {
    unsigned char my_char1;
    unsigned char my_char2;
    unsigned char my_char3;
    unsigned char my_char4;
   };
} my_sptp;

void setup() {
  // put your setup code here, to run once:
 Serial.begin(9600);
/* my_sptp.my_char1 = 1;
 my_sptp.my_char2 = 2;
 my_sptp.my_char3 = 3;
 my_sptp.my_char4 = 4;
 */
}

void loop() {
  // put your main code here, to run repeatedly:

  for (long test_cnt=0; test_cnt<=300000; test_cnt++)
  {
 my_sptp.my_long=test_cnt;
 Serial.println(my_sptp.my_long, HEX);
 Serial.print(my_sptp.my_int2, HEX);Serial.print(F(" : "));
 Serial.println(my_sptp.my_int1, HEX);
 Serial.print(my_sptp.my_char4, HEX);Serial.print(F(" : "));
 Serial.print(my_sptp.my_char3, HEX);Serial.print(F(" : "));
 Serial.print(my_sptp.my_char2, HEX);Serial.print(F(" : "));
 Serial.println(my_sptp.my_char1, HEX);
 delay(500);
  }
 
  while (1)
  {
   
  }
}

Вполне себе работоспособный (проверено на адуринке-нано).
Однако от того, что тут https://radiokot.ru/forum/viewtopic.php ... 0#p3990790 явно отличается...
неуж-то компиляторы столь разные??...
:roll:

Re: Котуинко

Пт мар 05, 2021 13:05:05

BOB51, что от чего отличается ?
Код разный ? Тогда причём тут компилятор ? Или код одинаковый, но результат разный ?
Напиши всё в одном месте, связанно и осмысленно. Без ссылок туда-сюда и всяческих загадок ... :dont_know:

Re: Котуинко

Пт мар 05, 2021 13:25:00

объявление UNION, создание экземпляра объединения
в моем тесте
Код:
union {
  long my_long;
  struct
   {
    unsigned int my_int1;
    unsigned int my_int2;
   };
  struct
   {
    unsigned char my_char1;
    unsigned char my_char2;
    unsigned char my_char3;
    unsigned char my_char4;
   };
} my_sptp;

экземпляры структур внутри UNION не создаются
в основной программе обращение к элементам объединения к примеру my_sptp.my_int2 или my_sptp.my_char3....

и у AxisPod
Код:
#pragma pack(push, 1)
union char_to_long {
  struct {
    char c1;
    char c2;
    char c3;
    char c4;
  } chars;
  long int value;
}
#pragma pack(pop)

а тут экземпляр структуры chars задан внутри объединения char_to_long
:roll:

Re: Котуинко

Пт мар 05, 2021 13:35:43

анонимные структуры и объединения поддерживаются не всеми версиями компиляторов, в некоторых для такой поддержки надо какие-то ключики/опции активировать.
первый пример - с анонимными структурами, второй - кассический, с именованными.

Re: Котуинко

Пт мар 05, 2021 14:57:45

BOB51, и ? Что смутило ? Компилятор тут причём ? :)

В первом варианте - создан анонимный тип union, с анонимными структурами внутри, и объявлен его экземпляр.
Во втором случае - создан именованный тип union, с именованными структурами внутри.

Re: Котуинко

Пт мар 05, 2021 22:36:13

Имена переменных с двумя точками...
:?
несколько ... однако это Си...
Спойлер
Код:
union {
  long my_long;
  struct
   {
    unsigned int my_int1;
    unsigned int my_int2;
   } tests1;
  struct
   {
    unsigned char my_char1;
    unsigned char my_char2;
    unsigned char my_char3;
    unsigned char my_char4;
   } tests2;
} my_sptp;

/*
union {
  long my_long;
  struct
   {
    unsigned int my_int1;
    unsigned int my_int2;
   };
  struct
   {
    unsigned char my_char1;
    unsigned char my_char2;
    unsigned char my_char3;
    unsigned char my_char4;
   };
} my_sptp;
*/

void setup() {
  // put your setup code here, to run once:
 Serial.begin(9600);
/* my_sptp.my_char1 = 1;
 my_sptp.my_char2 = 2;
 my_sptp.my_char3 = 3;
 my_sptp.my_char4 = 4;
 */
}

void loop() {
  // put your main code here, to run repeatedly:

  for (long test_cnt=0; test_cnt<=300000; test_cnt++)
  {
 my_sptp.my_long=test_cnt;
 Serial.println(my_sptp.my_long, HEX);
 Serial.print(my_sptp.tests1.my_int2, HEX);Serial.print(F(" : "));
 Serial.println(my_sptp.tests1.my_int1, HEX);
 Serial.print(my_sptp.tests2.my_char4, HEX);Serial.print(F(" : "));
 Serial.print(my_sptp.tests2.my_char3, HEX);Serial.print(F(" : "));
 Serial.print(my_sptp.tests2.my_char2, HEX);Serial.print(F(" : "));
 Serial.println(my_sptp.tests2.my_char1, HEX);
 delay(500);
  }
 
  while (1)
  { }
}

при том, что конструкция типа
Спойлер
Код:
union  my_sptp {
  long my_long;
  struct
   {
    unsigned int my_int1;
    unsigned int my_int2;
   }tests1;
  struct
   {
    unsigned char my_char1;
    unsigned char my_char2;
    unsigned char my_char3;
    unsigned char my_char4;
   }tests2;
}; // my_sptp;

для компилятора недопустима - собственно участок с union проскочит, а вот при вызове переменных идут матюки.

т.е. вызвавший интерес пример должен бы по идее смотреться вот так:
Спойлер
Код:
#pragma pack(push, 1)
// union char_to_long {
union {
  struct {
    char c1;
    char c2;
    char c3;
    char c4;
  } chars;
  long int value;
} char_to_long;
#pragma pack(pop)

....
:roll:

Дополнительное замечание по тесту на ардуинке - нано (old bootloader)...
При повторной загрузке во время работы тест-прожки иногда портит бутлоадер - приходится ставить на "внешний" SiProg+avrdudeshell давать общее стирание, затем грузить бутлоадер из-под ардуиноIDE+arduinoISP...
Вероятная причина - сбой протокола в адуринке в случае когда старая программа использует UART на передачу данных при одновременном встречном потоке данных для бутлоадера. Замечено уже второй раз именно для old bootloader.
:roll:

ПОПАЛСЯ БАГ!
В принципе ситуация следующая.
Программка в адуринке работает с отсылкой данных по UART.
Куда - не столь важно, главное что используется тот же СОМ порт, что и при прошивке бутлоадера.
А мы вознамерились эту платку перепрошить чем-то новеньким...
Так вот, чтоб не возникало "заскоков" последовательность действий (по крайней мере на моей текущей 1.8.9 +ХР):
1. подключаем платку адуринки
2. запускаем IDE
3. независимо от необходимости В ОБЯЗАТЕЛЬНОМ ПОРЯДКЕ открываем монитор порта
4. запускаем компиляцию с последующей прошивкой.
В этом случае IDE корректно остановит программу в платке перед последующим запуском прошивки.
Если монитор порта не запускать - вот тогда и "заскоки" последуют.
:twisted:

В связи с интересом прокрутил пяток вариантов написания для UNION для адуринки...
все проверены и компилятором и макетом и одинаково работоспособны
а вот написание... иногда мозг таки мутит с непривычки...

Спойлер
Код:
//----------
// вариант 5

  struct two_int
   {
    unsigned int my_int1;
    unsigned int my_int2;
   };
  struct four_char
   {
    unsigned char my_char1;
    unsigned char my_char2;
    unsigned char my_char3;
    unsigned char my_char4;
   };


union my_union{
  long my_long;
  two_int tests1;
  four_char tests2;

} my_sptp;

/*

//----------
// вариант 4

union my_union{
  long my_long;
  struct
   {
    unsigned int my_int1;
    unsigned int my_int2;
   }tests1;
  struct
   {
    unsigned char my_char1;
    unsigned char my_char2;
    unsigned char my_char3;
    unsigned char my_char4;
   }tests2;
} my_sptp;



//----------
// вариант 3

union {
  long my_long;
  struct
   {
    unsigned int my_int1;
    unsigned int my_int2;
   }tests1;
  struct
   {
    unsigned char my_char1;
    unsigned char my_char2;
    unsigned char my_char3;
    unsigned char my_char4;
   }tests2;
}; // my_sptp;

 my_union my_sptp;


//----------
// вариант 2

union {
  long my_long;
  struct
   {
    unsigned int my_int1;
    unsigned int my_int2;
   }tests1;
  struct
   {
    unsigned char my_char1;
    unsigned char my_char2;
    unsigned char my_char3;
    unsigned char my_char4;
   }tests2;
} my_sptp;

//----------
// вариант 1


union {
  long my_long;
  struct
   {
    unsigned int my_int1;
    unsigned int my_int2;
   };
  struct
   {
    unsigned char my_char1;
    unsigned char my_char2;
    unsigned char my_char3;
    unsigned char my_char4;
   };
} my_sptp;

//----------
*/

void setup() {
  // put your setup code here, to run once:
 Serial.begin(9600);
/* my_sptp.my_char1 = 1;
 my_sptp.my_char2 = 2;
 my_sptp.my_char3 = 3;
 my_sptp.my_char4 = 4;
 */
}

void loop() {
  // put your main code here, to run repeatedly:

//  for (long test_cnt=0; test_cnt<=300000; test_cnt++)
 for (my_sptp.my_long=0; my_sptp.my_long<=(500); my_sptp.my_long++)
  {

// my_sptp.my_long=test_cnt;
 Serial.print(my_sptp.my_long, HEX);Serial.print(F(" :: "));
 Serial.println(my_sptp.my_long, DEC);
 Serial.print(my_sptp.tests1.my_int2, HEX);Serial.print(F(" : "));
 Serial.println(my_sptp.tests1.my_int1, HEX);
 Serial.print(my_sptp.tests2.my_char4, HEX);Serial.print(F(" : "));
 Serial.print(my_sptp.tests2.my_char3, HEX);Serial.print(F(" : "));
 Serial.print(my_sptp.tests2.my_char2, HEX);Serial.print(F(" : "));
 Serial.println(my_sptp.tests2.my_char1, HEX);
 
// delay(500);

  }
 
  while (1)
  {
   
  }
}

8)

Re: Котуинко

Вс мар 07, 2021 11:17:16

BOB51 писал(а):при том, что конструкция типа
для компилятора недопустима
BOB51, Вы серьёзно не видите разницу между
Код:
union t_union {
   .......
   .......
};
и
Код:
union {
   .......
   .......
} m_union;
?
:roll:

Re: Котуинко

Вс мар 07, 2021 17:16:22

Так с этой разницы вопрос и возник.
8)
Есть объявление объединения, но нет создания самого объединения (объекта).
Да и вызов переменной с двумя точками в имени... как-то в примерах раньше не попадался...
Тем более само применение комбинирования union+struct на практике редкость...
Под ассемблером такой прием более часто применяется.
:roll:
Осталось еще enum переварить.
8)

Re: Котуинко

Вс мар 07, 2021 17:40:41

Аlex писал(а):не видите разницу между
вот чтобы не попадать в подобные ситуации, я никогда так не определяю типы, а только через typedef:
Аlex писал(а):union t_union {
   .......
   .......
};
Код:
typedef union{
....
....
} t_union;

Re: Котуинко

Вс мар 07, 2021 18:26:58

BOB51 писал(а):Есть объявление объединения, но нет создания самого объединения (объекта).
Совершенно верно. Это в одном случае.
В другом - создаётся объект.

Так почему тогда "конструкция для компилятора недопустима" ?
Вы уже 2 странички хаете компилятор, но никак не можете сказать, что он делает не так :dont_know:


ARV писал(а):только через typedef
Я тоже.

Re: Котуинко

Вс мар 07, 2021 19:09:39

Если оставить только описание без создания объекта то ессно при обращении к переменным компилятор пошлет подальше...
Хотя внешне весьма похоже на определение функции...
Да и typedef... К имени или к объекту.?.. Ибо имя обьединения(структуры) по факту определяет тип и без дополнительного typedef
Код:
  struct two_int
   {
    unsigned int my_int1;
    unsigned int my_int2;
   };
  struct four_char
   {
    unsigned char my_char1;
    unsigned char my_char2;
    unsigned char my_char3;
    unsigned char my_char4;
   };
 union my_union
  {
   long my_long;
   two_int tests1;
   four_char tests2;
  };

 my_union my_sptp;

....
:dont_know: :roll:
Кстати... А сколько (теоретически) может быть точек в имени переменной?
:?
Последний раз редактировалось BOB51 Вс мар 07, 2021 19:37:23, всего редактировалось 1 раз.

Re: Котуинко

Вс мар 07, 2021 19:34:45

BOB51 писал(а):А сколько (теоретически) может быть точек в имени переменной?
НИ ОДНОЙ

точка не является частью имени переменной, а служит разделителем между именами полей

в документации к каждому компилятору указываетс, какая длина у имени может быть. я головой не поручусь, но вроде бы GCC 32 символа допускает (остальные не анализируются, т.е. не участвуют в различении переменных)...

Re: Котуинко

Вс мар 07, 2021 19:39:39

Я ж и имел ввиду нечто подобно-монструозное:
Код:
my_sptp.tests2.my_char3

переменная my_char3 из структуры tests2 входящей в объединение my_sptp....
Честно говоря два префикса поначалу малость ошарашили...
:?

Re: Котуинко

Вс мар 07, 2021 23:18:52

Есть объявление объединения, но нет создания самого объединения (объекта).
Да и вызов переменной с двумя точками в имени... как-то в примерах раньше не попадался...
Тем более само применение комбинирования union+struct на практике редкость...
Под ассемблером такой прием более часто применяется.
Осталось еще enum переварить.

Если оставить только описание без создания объекта то ессно при обращении к переменным компилятор пошлет подальше...
Хотя внешне весьма похоже на определение функции...
Да и typedef... К имени или к объекту.?.. Ибо имя обьединения(структуры) по факту определяет тип и без дополнительного typedef


BOB51
, "Мая твая не панимай" (с)
Ты строчишь какой-то непонятный набор слов, который осмыслить просто нереально. Приплетаешь сюда ассемблер, какие-то функции, ...
Опиши чётко и внятно проблему. Получишь чёткий и внятный ответ. Без всяких там непонятных мыслей и ненужных фраз....

Re: Котуинко

Вс мар 07, 2021 23:40:52

Да и typedef... К имени или к объекту.?..

Очевидно же, что TypeDefinition - это к типу, а вообще в современном C++ typedef не используется.

ps. Давай типам имена с большой буквы, будет меньше путаницы:
Код:
union MyUnion
{
    long my_long;
    TwoInt tests1;
    FourChar tests2;
};

MyUnion my_sptp;

Re: Котуинко

Пн мар 08, 2021 09:43:31

Допустим typedef относительно указателя на функцию штука вполне оправданная....
Но в случае с именованной структурой или именованным объединением это возможно излишне - и так уже присутствует тип соответствующий имени.
:dont_know:

Re: Котуинко

Пн мар 08, 2021 10:13:22

Допустим typedef относительно указателя на функцию штука вполне оправданная....

Это устаревший подход, не удивлюсь если в С++23 typedef пометят как deprecated... То же самое, но более наглядно, можно сделать при помощи using:
Код:
using FP = void(*)(int);

Или даже так:
Код:
using F = void(int);
F* f = func;

Re: Котуинко

Пн мар 08, 2021 10:19:55

Пока что пользуемся достаточно "древними" вариантами.
У МК С++ вроде только в ардуинке "прописался" (и то не во всех платформах)...
8)
Ответить