Котуинко

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Котуинко

Сообщение oleg110592 »

на просторах есть обрезанный образ вин10х64, называется "tiny10 b4 x64.iso". Памяти после загрузки 447мб занимает, на винте около 3Гб, процессов в диспетчере задач - всего 32. Пробовал на слабом ноутбуке - вполне норм. шевелится, VSCode там работал, а новая ардуино ИДЕ на такой же основе. Правда интерфейс английский, но мы ж программисты - народ мясистый, если Си и ассемблер знаем - значит и английский знаем.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15552
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

То ужшшш лучше подождать до обновления системника - все равно когда-то да придется тратиться...
:sleep:
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15552
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Как-то уже пережевывали с 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:
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Котуинко

Сообщение Аlex »

BOB51, что от чего отличается ?
Код разный ? Тогда причём тут компилятор ? Или код одинаковый, но результат разный ?
Напиши всё в одном месте, связанно и осмысленно. Без ссылок туда-сюда и всяческих загадок ... :dont_know:
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15552
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

объявление 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:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Котуинко

Сообщение Аlex »

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

В первом варианте - создан анонимный тип union, с анонимными структурами внутри, и объявлен его экземпляр.
Во втором случае - создан именованный тип union, с именованными структурами внутри.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15552
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Имена переменных с двумя точками...
:?
несколько ... однако это Си...
Спойлер

Код: Выделить всё

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)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Котуинко

Сообщение Аlex »

BOB51 писал(а):при том, что конструкция типа
для компилятора недопустима
BOB51, Вы серьёзно не видите разницу между

Код: Выделить всё

union t_union {
   .......
   .......
};
и

Код: Выделить всё

union {
   .......
   .......
} m_union;
?
:roll:
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15552
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Так с этой разницы вопрос и возник.
8)
Есть объявление объединения, но нет создания самого объединения (объекта).
Да и вызов переменной с двумя точками в имени... как-то в примерах раньше не попадался...
Тем более само применение комбинирования union+struct на практике редкость...
Под ассемблером такой прием более часто применяется.
:roll:
Осталось еще enum переварить.
8)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

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

Код: Выделить всё

typedef union{
....
....
} t_union;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Котуинко

Сообщение Аlex »

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

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

ARV писал(а):только через typedef
Я тоже.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15552
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Если оставить только описание без создания объекта то ессно при обращении к переменным компилятор пошлет подальше...
Хотя внешне весьма похоже на определение функции...
Да и 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 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

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

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

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

Мой уютный бложик... заходите!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15552
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

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

Код: Выделить всё

my_sptp.tests2.my_char3
переменная my_char3 из структуры tests2 входящей в объединение my_sptp....
Честно говоря два префикса поначалу малость ошарашили...
:?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Котуинко

Сообщение Аlex »

Есть объявление объединения, но нет создания самого объединения (объекта).
Да и вызов переменной с двумя точками в имени... как-то в примерах раньше не попадался...
Тем более само применение комбинирования union+struct на практике редкость...
Под ассемблером такой прием более часто применяется.
Осталось еще enum переварить.
[uquote="BOB51",url="/forum/viewtopic.php?p=3993370#p3993370"]Если оставить только описание без создания объекта то ессно при обращении к переменным компилятор пошлет подальше...
Хотя внешне весьма похоже на определение функции...
Да и typedef... К имени или к объекту.?.. Ибо имя обьединения(структуры) по факту определяет тип и без дополнительного typedef[/uquote]

BOB51
, "Мая твая не панимай" (с)
Ты строчишь какой-то непонятный набор слов, который осмыслить просто нереально. Приплетаешь сюда ассемблер, какие-то функции, ...
Опиши чётко и внятно проблему. Получишь чёткий и внятный ответ. Без всяких там непонятных мыслей и ненужных фраз....
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Котуинко

Сообщение Reflector »

[uquote="BOB51",url="/forum/viewtopic.php?p=3993370#p3993370"]Да и typedef... К имени или к объекту.?..[/uquote]
Очевидно же, что TypeDefinition - это к типу, а вообще в современном C++ typedef не используется.

ps. Давай типам имена с большой буквы, будет меньше путаницы:

Код: Выделить всё

union MyUnion
{
    long my_long;
    TwoInt tests1;
    FourChar tests2;
};

MyUnion my_sptp;
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15552
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Допустим typedef относительно указателя на функцию штука вполне оправданная....
Но в случае с именованной структурой или именованным объединением это возможно излишне - и так уже присутствует тип соответствующий имени.
:dont_know:
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Котуинко

Сообщение Reflector »

[uquote="BOB51",url="/forum/viewtopic.php?p=3993671#p3993671"]Допустим typedef относительно указателя на функцию штука вполне оправданная....[/uquote]
Это устаревший подход, не удивлюсь если в С++23 typedef пометят как deprecated... То же самое, но более наглядно, можно сделать при помощи using:

Код: Выделить всё

using FP = void(*)(int);
Или даже так:

Код: Выделить всё

using F = void(int);
F* f = func;
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15552
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

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

Вернуться в «Разные вопросы по МК»