Преобразование структуры в массив байт
Запись от netBool размещена 06.04.2018 в 16:38
Показов 6834
Комментарии 9
Уже полтора дня потерял в поисках ответа, почему не работает вот этот код:
Оказывается, есть такая маленькая настроечка: Проект->Свойства->Свойства конфигурации->C++->Создание кода->Выравнивание членов структур->1 байт (\Zp1). И все, вуаля! Все заработало!! но блин, ребята, полтора дня! До этого стояло "по умолчанию"... так вот по умолчанию, видимо, 4 байта... PS: как верно подметил в комментариях Rius, что можно было это сделать и с помощью #pragma (работает для MinGW и GCC). Под QTCreator (где нет настроек с \Zp1) я сделал так:
Но можно, конечно, и без выравнивания сделать. Думаю, на нашем примере будет наиболее оптимально так:
| ||||||||||||||||||||
Размещено в C++
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 9
Комментарии
-
Лучше 5 часов потратить, потом за 5 минут долететь!
Там ещё есть директивы, влияющие на конкретную указанную структуру, а не на весь проект.
Вроде так выглядит:
Настройки проекта вы можете легко забыть и потерять, если скопируете код в другой проект.C++ 1 2 3 4 5 6 7 8 9 10 11
#pragma pack(push) /* сохранить текущие настройки выравнивания (или упаковки?) */ #pragma pack(1) /* установить выравнивание в 1 байт */ struct jmp_far { BYTE instr_push; //здесь будет код инструкции push DWORD arg; //аргумент push BYTE instr_ret; //здесь будет код инструкции ret }; #pragma pack(pop) /* вернуть предыдущие настройки */
А вот в коде директивы останутся.Запись от Rius размещена 06.04.2018 в 17:47
-
Запись от Avazart размещена 06.04.2018 в 17:53
-
Запись от netBool размещена 07.04.2018 в 11:28
-
Запись от _SayHello размещена 23.04.2018 в 12:34
-
Запись от netBool размещена 04.05.2018 в 09:59
-
Не по теме:
Нашел еще на стеке, а потом и тут наткнулся на решение для GCC/MinGW в виде ключа компиляции -mno-ms-bitfields
Вроде тоже на упаковку влияет. Пока не проверял
C++ (Qt) 1
QMAKE_CXXFLAGS += -mno-ms-bitfields
Запись от netBool размещена 11.06.2018 в 12:00
-
Я так на ARM7TDMI сделал как-то раз. Всё же здесь просто и очевидно. А потом искал причину бага на ровном месте: число в один массив нормально копируется, а в другой такой же - хрень получается.
Оказалось, требовалось выравнивание по границе 4 байт (32-битное слово).
Так что вы поосторожнее с таким.
О выравнивании памяти на ARM процессорах на простом примере.Запись от Rius размещена 11.06.2018 в 12:11
-
Запись от netBool размещена 11.06.2018 в 12:51
-
Сработало, да. Но причина и аппаратная в том числе.
The curious case of unaligned access on ARMЗапись от Rius размещена 11.06.2018 в 16:47


