Benish |
Отправлено: 29.09.2004, 16:09 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 67
|
Господа, подскажите!
Создал структуру:
struct pst {
unsigned __int16 begin;
unsigned __int32 Status;
unsigned __int32 Port;
unsigned __int8 Pstea;
__int16 Pva;
unsigned __int8 Pair;
__int16 Pga;
unsigned __int8 Gaz_val;
unsigned __int8 Tw_eco;
unsigned __int8 Tw;
unsigned __int16 Tdust;
unsigned __int8 NAD;
unsigned __int8 Toil;
unsigned __int8 Poil;
unsigned __int16 end;
};
Затем объединение:
union pun {
byte Buffproc [64];
struct pst p;} pu;
При обращении, оказывается, что в pu.p.Status попадают не Buffproc[2,3,4,5], а Buffproc[4,5,6,7],
т.е. p.pu.begin при своем размере в 2 байта, на самом деле занимает 4. Подобным образом ведут себя и некоторые другие переменные(pu.p.Pstea, pu.p.Pair, pu.p.Tw, pu.p.Poil ). Я понимаю, что происходит какое-то выравнивание, но можно ли как то это обойти?
Уж больно идея хорошая.
Спасибо.
|
|
timson |
Отправлено: 29.09.2004, 19:28 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 82
|
правильно — выравнивание..
Project options -> Advanced Compiler -> Data alignment -> Byte
но лучше не делать так, ведь выравнивание по 32 битам быстрее работает.
надо с помощью дерективы прекомпилера:
CODE |
#pragma pack(push) // сохран. тек. значение выравнивания в стеке прекомпилера
#pragma pack(1) // устан. значение выравнивания в 1 байт
struct pst
{
unsigned __int16 begin;
unsigned __int32 Status;
//...
};
#pragma pack(pop) // востанавливаем выравнивание
|
и должно быть все ОК.....
|
|
Konstantine |
Отправлено: 30.09.2004, 08:21 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
Можно ещё и так:
CODE | struct pst
{
unsigned __int16 begin :16;
unsigned __int32 Status :32;
//...
|
|
|
Benish |
Отправлено: 30.09.2004, 12:02 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 67
|
Спасибо большое!
Зы. Кстати, 2-й вариант (":16") — не работает |
|
Konstantine |
Отправлено: 30.09.2004, 12:13 |
|
Мастер участка
Группа: Модератор
Сообщений: 545
|
QUOTE (Benish @ 30/09/2004, 13:04) | Спасибо большое!
Зы. Кстати, 2-й вариант (":16") — не работает |
а если с обычными интами?
|
|
timson |
Отправлено: 30.09.2004, 19:24 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 82
|
QUOTE (Konstantine @ 30/09/2004, 09:23) | Можно ещё и так:
CODE | struct pst
{
unsigned __int16 begin :16;
unsigned __int32 Status :32;
//...
|
|
битовые поля (bit fields) очень ограничены в использовании, спецефичные. и все равно выравнивание будет в 4 байта.
|
|