то есть автор берет и самым беспардонным образом обьявляет указатель на символьный буфер указателем на структуру. А это и есть “нарушение правил приведения типов” в самом грубом виде.
Интересно тут другое - ошибки валятся только при сборке на 32-битных камнях, например на Дуе. А на 8битной Меге ошибок нет. Почему так?
Это связано с разными настройками компилятора или этот варнинг как-то зависит от архитектуры и на 8битках не проявляется?
И еще, буду признателен за любые идеи, как изменить преобразование буфера к структуре. чтобы строгие правила не нарушались и варнинг не появлялся?
Так ли пустое?
Автор берет и присваивает произвольный адрес в памяти указателю на структуру. А я слышал, что в некоторых 32битных архитектурах ты просто не можешь положить в память 4-байтный инт без выравнивания на границу слова.
То есть если присвоить указателю на инт значение, не кратное четырем - выйдет фигня, или говоря по научному “undefined behavior”
Я не прав?
Да, было такое, я сам сталкивался как раз в таком преобразовании и на АРМ архитектуре.
Но тут же вроде наоборот? из буфера в структуру переводят.
Ну и не станешь же ты библиотеку переписывать?
ТОка блин! Я сталкивался с этим 20 лет назад!!! Мне кажется, что АРМ архитектура немного развилась с тех пор. Нет?
да вроде как раз не наоборот.
Берут буфер типа char и его произвольный элемент обьявляют началом структуры. То есть тут это самое выравнивание в полный рост.
Кстати, наверно именно поэтому варнинги вылазят на 32битным Дуе и “молчат” на Меге.
Ну… при выделении памяти под буфер выровнять сразу, да и маллок наверное сам выравнивает. А от ворнинга как избавиться - сходе не соображу. Это тебе к нашему “гуру”. Есть несколько старых способов, типа того, что char * преобразуется к чему угодно. Но не знаю, работают ли они сейчас.
Вернее так: если не работает, то придется реально подумать о выравнивании по 4 байтам. Если работает и просто “ноет”, то попробуй всякую тяжелую артиллерию типа (reinterpret_cast)
выравнивание не поможет
Весь смысл этой клоунады, если я правильно понял исходный код - в том что они двигают начало структуры по буферу, подбирая в каком именно месте принятых данных начинается нужный пакет…
Это понятно.
Только ведь именно из-за того, что у них эта структура “скользящим окном” работает - каждый раз копировать ее в другое место дико накладно выходит.
Что-то не соображу, как сделать эффективнее и при этом варнинг убрать.
ВОт еще. Это не я сам про такой атрибут узнал. Это чатЖПТ, поэтому проверять надо - работает ли такой способ. Он врёт очень часто. Пишет, что такое есть в GCC.
А вот так уже на грабли наступить можно. Не надо так этот варнинг затыкать.
Почитайте в описании GCC про strict aliasing, и как он помогает в оптимизации. По умолчанию этот варнинг вообще выключен. Не устаю повторять, что набор флагов компилятора Arduino IDE вызывает изумление.
Этот варнинг обычно включают там, где хотят выжать из оптимизатора все, что можно.