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

Re: Котуинко
Как-то уже пережевывали с ARV тему UNION...
Однако глянул вот тут
https://radiokot.ru/forum/viewtopic.php ... 0#p3990790
Да решил под адуринку проверить... (а заодно посмотреть куда выравнивает вомпилятор - к старшим или к младшим байтам)...
То все теория "как разместить?" а кусманчика "как применить" и нету...
Тем более, что симулятор (UnoArduSim 2.9.1) подобную конструкцию не понимает...
Получился вот такой тестик симпатяшный:
Вполне себе работоспособный (проверено на адуринке-нано).
Однако от того, что тут https://radiokot.ru/forum/viewtopic.php ... 0#p3990790 явно отличается...
неуж-то компиляторы столь разные??...

Однако глянул вот тут
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 явно отличается...
неуж-то компиляторы столь разные??...
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Котуинко
BOB51, что от чего отличается ?
Код разный ? Тогда причём тут компилятор ? Или код одинаковый, но результат разный ?
Напиши всё в одном месте, связанно и осмысленно. Без ссылок туда-сюда и всяческих загадок ...
Код разный ? Тогда причём тут компилятор ? Или код одинаковый, но результат разный ?
Напиши всё в одном месте, связанно и осмысленно. Без ссылок туда-сюда и всяческих загадок ...
Re: Котуинко
объявление UNION, создание экземпляра объединения
в моем тесте
экземпляры структур внутри UNION не создаются
в основной программе обращение к элементам объединения к примеру my_sptp.my_int2 или my_sptp.my_char3....
и у AxisPod
а тут экземпляр структуры chars задан внутри объединения char_to_long

в моем тесте
Код: Выделить всё
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;
в основной программе обращение к элементам объединения к примеру 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)- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Котуинко
анонимные структуры и объединения поддерживаются не всеми версиями компиляторов, в некоторых для такой поддержки надо какие-то ключики/опции активировать.
первый пример - с анонимными структурами, второй - кассический, с именованными.
первый пример - с анонимными структурами, второй - кассический, с именованными.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Котуинко
BOB51, и ? Что смутило ? Компилятор тут причём ?
В первом варианте - создан анонимный тип union, с анонимными структурами внутри, и объявлен его экземпляр.
Во втором случае - создан именованный тип union, с именованными структурами внутри.
В первом варианте - создан анонимный тип union, с анонимными структурами внутри, и объявлен его экземпляр.
Во втором случае - создан именованный тип union, с именованными структурами внутри.
Re: Котуинко
Имена переменных с двумя точками...
несколько ... однако это Си...
при том, что конструкция типа
для компилятора недопустима - собственно участок с union проскочит, а вот при вызове переменных идут матюки.
т.е. вызвавший интерес пример должен бы по идее смотреться вот так:
....
Дополнительное замечание по тесту на ардуинке - нано (old bootloader)...
При повторной загрузке во время работы тест-прожки иногда портит бутлоадер - приходится ставить на "внешний" SiProg+avrdudeshell давать общее стирание, затем грузить бутлоадер из-под ардуиноIDE+arduinoISP...
Вероятная причина - сбой протокола в адуринке в случае когда старая программа использует UART на передачу данных при одновременном встречном потоке данных для бутлоадера. Замечено уже второй раз именно для old bootloader.

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

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

несколько ... однако это Си...
Спойлер
Код: Выделить всё
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;т.е. вызвавший интерес пример должен бы по идее смотреться вот так:
Спойлер
Код: Выделить всё
#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)Дополнительное замечание по тесту на ардуинке - нано (old bootloader)...
При повторной загрузке во время работы тест-прожки иногда портит бутлоадер - приходится ставить на "внешний" SiProg+avrdudeshell давать общее стирание, затем грузить бутлоадер из-под ардуиноIDE+arduinoISP...
Вероятная причина - сбой протокола в адуринке в случае когда старая программа использует UART на передачу данных при одновременном встречном потоке данных для бутлоадера. Замечено уже второй раз именно для old bootloader.
ПОПАЛСЯ БАГ!
В принципе ситуация следующая.
Программка в адуринке работает с отсылкой данных по UART.
Куда - не столь важно, главное что используется тот же СОМ порт, что и при прошивке бутлоадера.
А мы вознамерились эту платку перепрошить чем-то новеньким...
Так вот, чтоб не возникало "заскоков" последовательность действий (по крайней мере на моей текущей 1.8.9 +ХР):
1. подключаем платку адуринки
2. запускаем IDE
3. независимо от необходимости В ОБЯЗАТЕЛЬНОМ ПОРЯДКЕ открываем монитор порта
4. запускаем компиляцию с последующей прошивкой.
В этом случае IDE корректно остановит программу в платке перед последующим запуском прошивки.
Если монитор порта не запускать - вот тогда и "заскоки" последуют.
В связи с интересом прокрутил пяток вариантов написания для 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)
{
}
}- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Котуинко
BOB51, Вы серьёзно не видите разницу междуBOB51 писал(а):при том, что конструкция типа
для компилятора недопустима
Код: Выделить всё
union t_union {
.......
.......
};
Код: Выделить всё
union {
.......
.......
} m_union;
Re: Котуинко
Так с этой разницы вопрос и возник.
Есть объявление объединения, но нет создания самого объединения (объекта).
Да и вызов переменной с двумя точками в имени... как-то в примерах раньше не попадался...
Тем более само применение комбинирования union+struct на практике редкость...
Под ассемблером такой прием более часто применяется.
Осталось еще enum переварить.

Есть объявление объединения, но нет создания самого объединения (объекта).
Да и вызов переменной с двумя точками в имени... как-то в примерах раньше не попадался...
Тем более само применение комбинирования union+struct на практике редкость...
Под ассемблером такой прием более часто применяется.
Осталось еще enum переварить.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Котуинко
вот чтобы не попадать в подобные ситуации, я никогда так не определяю типы, а только через typedef:Аlex писал(а):не видите разницу между
Аlex писал(а):union t_union {
.......
.......
};
Код: Выделить всё
typedef union{
....
....
} t_union;если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Котуинко
Совершенно верно. Это в одном случае.BOB51 писал(а):Есть объявление объединения, но нет создания самого объединения (объекта).
В другом - создаётся объект.
Так почему тогда "конструкция для компилятора недопустима" ?
Вы уже 2 странички хаете компилятор, но никак не можете сказать, что он делает не так
Я тоже.ARV писал(а):только через typedef
Re: Котуинко
Если оставить только описание без создания объекта то ессно при обращении к переменным компилятор пошлет подальше...
Хотя внешне весьма похоже на определение функции...
Да и typedef... К имени или к объекту.?.. Ибо имя обьединения(структуры) по факту определяет тип и без дополнительного typedef
....
Кстати... А сколько (теоретически) может быть точек в имени переменной?

Хотя внешне весьма похоже на определение функции...
Да и 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;Кстати... А сколько (теоретически) может быть точек в имени переменной?
Последний раз редактировалось BOB51 Вс мар 07, 2021 19:37:23, всего редактировалось 1 раз.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Котуинко
НИ ОДНОЙBOB51 писал(а):А сколько (теоретически) может быть точек в имени переменной?
точка не является частью имени переменной, а служит разделителем между именами полей
в документации к каждому компилятору указываетс, какая длина у имени может быть. я головой не поручусь, но вроде бы GCC 32 символа допускает (остальные не анализируются, т.е. не участвуют в различении переменных)...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Котуинко
Я ж и имел ввиду нечто подобно-монструозное:
переменная my_char3 из структуры tests2 входящей в объединение my_sptp....
Честно говоря два префикса поначалу малость ошарашили...

Код: Выделить всё
my_sptp.tests2.my_char3Честно говоря два префикса поначалу малость ошарашили...
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Котуинко
[uquote="BOB51",url="/forum/viewtopic.php?p=3993370#p3993370"]Если оставить только описание без создания объекта то ессно при обращении к переменным компилятор пошлет подальше...Есть объявление объединения, но нет создания самого объединения (объекта).
Да и вызов переменной с двумя точками в имени... как-то в примерах раньше не попадался...
Тем более само применение комбинирования union+struct на практике редкость...
Под ассемблером такой прием более часто применяется.
Осталось еще enum переварить.
Хотя внешне весьма похоже на определение функции...
Да и typedef... К имени или к объекту.?.. Ибо имя обьединения(структуры) по факту определяет тип и без дополнительного typedef[/uquote]
BOB51, "Мая твая не панимай" (с)
Ты строчишь какой-то непонятный набор слов, который осмыслить просто нереально. Приплетаешь сюда ассемблер, какие-то функции, ...
Опиши чётко и внятно проблему. Получишь чёткий и внятный ответ. Без всяких там непонятных мыслей и ненужных фраз....
Re: Котуинко
[uquote="BOB51",url="/forum/viewtopic.php?p=3993370#p3993370"]Да и typedef... К имени или к объекту.?..[/uquote]
Очевидно же, что TypeDefinition - это к типу, а вообще в современном C++ typedef не используется.
ps. Давай типам имена с большой буквы, будет меньше путаницы:
Очевидно же, что TypeDefinition - это к типу, а вообще в современном C++ typedef не используется.
ps. Давай типам имена с большой буквы, будет меньше путаницы:
Код: Выделить всё
union MyUnion
{
long my_long;
TwoInt tests1;
FourChar tests2;
};
MyUnion my_sptp;Re: Котуинко
Допустим typedef относительно указателя на функцию штука вполне оправданная....
Но в случае с именованной структурой или именованным объединением это возможно излишне - и так уже присутствует тип соответствующий имени.

Но в случае с именованной структурой или именованным объединением это возможно излишне - и так уже присутствует тип соответствующий имени.
Re: Котуинко
[uquote="BOB51",url="/forum/viewtopic.php?p=3993671#p3993671"]Допустим typedef относительно указателя на функцию штука вполне оправданная....[/uquote]
Это устаревший подход, не удивлюсь если в С++23 typedef пометят как deprecated... То же самое, но более наглядно, можно сделать при помощи using:
Или даже так:
Это устаревший подход, не удивлюсь если в С++23 typedef пометят как deprecated... То же самое, но более наглядно, можно сделать при помощи using:
Код: Выделить всё
using FP = void(*)(int);Код: Выделить всё
using F = void(int);
F* f = func;Re: Котуинко
Пока что пользуемся достаточно "древними" вариантами.
У МК С++ вроде только в ардуинке "прописался" (и то не во всех платформах)...

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