Перейти к содержанию
    

Выравнивание данных в структуре

3 hours ago, jcxz said:

Ну да - в таком буреломе на пустом месте, больше размышлять придётся ища баги. Не до попаданий будет. И ещё не забывая всё это безобразие перепахивать по новой при малейшем изменении структуры.
Зачем ваять лисапед с треугольными колёсами, вместо того чтобы воспользоваться штатными возможностями компилятора??
Вы и 32-разрядные числа тоже поразрядно складываете? Снимая элемент случайности.  :crazy:

штатные возможности компилятора могут сработать в очень конкретном случае. когда мы разбираем структуру на байтики в пределах одного проекта. нам ведь потом эти байтики обратно складывать в структуру. в этом случае это работает. в принципе, нас даже не интересует: что и как там складывается,  более того, спокойно пройдет упаковка с дырками (если закрыть глаза на размер). а вот если разобранную структуру передаем вовне и из байтиков нужно будет ее опять сложить в структуру ,  скажем, в компе или в другом контроллере,  вот тут вот компилятору делать нечего - здесь нужно жестко задавать что где будет. ну и счастливчики работавшие с микрочипом знают что float в микрочипе это вовсе не 4 байта,  а три. а double вовсе не 8 байт а 4. и упаковка и распаковка таких разночтений простым костылем типа объединения не получится.

upd  заглянул остался ли этот ужас у микрочипа. ужас изменился: float - 4 байта,  а double и long double тоже 4 байта. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

кто-нибудь объясните откуда ещё три лишних байта у этой структуры в конце появилось? 

два раза по три байта перед флоатами понятно, но в конце-то зачем? offsetof(LOG_Type, Year) == 24

или не только положение самой структуры должно быть кратно самому большому её члену (align), но и размер тоже?

 

5 hours ago, firstvald said:

затаскиваю в специально созданный union  в котором будет 2 short int  1 float и 4 char

как это помогает с паддингом и выравниванием этих union внутри структуры?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, _pv said:

кто-нибудь объясните откуда ещё три лишних байта у этой структуры в конце появилось? 

два раза по три байта перед флоатами понятно, но в конце-то зачем? offsetof(LOG_Type, Year) == 24

или не только положение самой структуры должно быть кратно самому большому её члену (align), но и размер тоже?

 

как это помогает с паддингом и выравниванием этих union внутри структуры?

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, jcxz сказал:

А при чём тут...? Вроде разговор был про "выравнивание членов структуры", а не про "порядок байт"

При том, что протоколы разные бывают, и не всегда для передачи данных из некой структуры еë содержимое нужно выравнивать до байта и передавать "байт за байтом". Иной раз, выгоднее при приëме взять из приëмника некое число байт, привести к нужному виду и положить в элемент структуры. Или обратная процедура при передаче. В этом случае: выравнивание данных - "от лукавого".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...