link3692 link3693 link3694 link3695 link3696 link3697 link3698 link3699 link3700 link3701 link3702 link3703 link3704 link3705 link3706 link3707 link3708 link3709 link3710 link3711 link3712 link3713 link3714 link3715 link3716 link3717 link3718 link3719 link3720 link3721 link3722 link3723 link3724 link3725 link3726 link3727 link3728 link3729 link3730 link3731 link3732 link3733 link3734 link3735 link3736 link3737 link3738 link3739 link3740 link3741 link3742 link3743 link3744 link3745 link3746 link3747 link3748 link3749 link3750 link3751 link3752 link3753 link3754 link3755 link3756 link3757 link3758 link3759 link3760 link3761 link3762 link3763 link3764 link3765 link3766 link3767 link3768 link3769 link3770 link3771 link3772 link3773 link3774 link3775 link3776 link3777 link3778 link3779 link3780 link3781 link3782 link3783 link3784 link3785 link3786 link3787 link3788 link3789 link3790 link3791 link3792 link3793 link3794 link3795 link3796 link3797 link3798 link3799 link3800 link3801 link3802 link3803 link3804 link3805 link3806 link3807 link3808 link3809 link3810 link3811 link3812 link3813 link3814 link3815 link3816 link3817 link3818 link3819 link3820 link3821 link3822 link3823 link3824 link3825 link3826 link3827 link3828 link3829 link3830 link3831 link3832 link3833
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