C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
struct в union, использование структур в объединении
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) // востанавливаем выравнивание


и должно быть все ОК..... smile.gif
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") — не работает smile.gif
Konstantine
Отправлено: 30.09.2004, 12:13


Мастер участка

Группа: Модератор
Сообщений: 545



QUOTE (Benish @ 30/09/2004, 13:04)
Спасибо большое!

Зы. Кстати, 2-й вариант (":16") — не работает smile.gif

а если с обычными интами?
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 байта.

Вернуться в Вопросы программирования в C++Builder