Фигня с битфилдами в IAR 2.28 для AVR
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено IAR 21 ноября 2003 г. 13:50

Если написать так:

#typedef unsigned long DWORD
#typedef unsigned char BYTE
#pragma pack(1)
struct TIME {
union {
BYTE b[4];
struct {
DWORD sec:6;
DWORD min:6;
DWORD hours:5;
DWORD day:5;
DWORD month:4;
DWORD year:6;
};
DWORD dw;
};
TIME() {dw=0;}
};

то в программе sizeof(TIME) равно 4.
А если так:

#typedef unsigned long DWORD
#typedef unsigned char BYTE
#pragma pack(1)
struct TIME {
union {
BYTE b[4];
struct {
BYTE sec:6;
BYTE min:6;
BYTE hours:5;
BYTE day:5;
BYTE month:4;
BYTE year:6;
};
DWORD dw;
};
TIME() {dw=0;}
};

то sizeof(TIME) получается 6!

И что это за фигня такая? Я хочу получать битфилды в виде байтов,
а не DWORD. Можно, конечно, извратиться и написать инлайновых
элементов типа
BYTE Get_sec() {return BYTE(sec);} в структуре с DWORDами,
но это же совсем изврат. Компилятор и так должен был битфилды
упаковать в 4 байта, разве он имеет право оптимизировать их
и упаковывать в 6 байт?

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru