link8260 link8261 link8262 link8263 link8264 link8265 link8266 link8267 link8268 link8269 link8270 link8271 link8272 link8273 link8274 link8275 link8276 link8277 link8278 link8279 link8280 link8281 link8282 link8283 link8284 link8285 link8286 link8287 link8288 link8289 link8290 link8291 link8292 link8293 link8294 link8295 link8296 link8297 link8298 link8299 link8300 link8301 link8302 link8303 link8304 link8305 link8306 link8307 link8308 link8309 link8310 link8311 link8312 link8313 link8314 link8315 link8316 link8317 link8318 link8319 link8320 link8321 link8322 link8323 link8324 link8325 link8326 link8327 link8328 link8329 link8330 link8331 link8332 link8333 link8334 link8335 link8336 link8337 link8338 link8339 link8340 link8341 link8342 link8343 link8344 link8345 link8346 link8347 link8348 link8349 link8350 link8351 link8352 link8353 link8354 link8355 link8356 link8357 link8358 link8359 link8360 link8361 link8362 link8363 link8364 link8365 link8366 link8367 link8368 link8369 link8370 link8371 link8372 link8373 link8374 link8375 link8376 link8377 link8378 link8379 link8380 link8381 link8382 link8383 link8384 link8385 link8386 link8387 link8388 link8389 link8390 link8391 link8392 link8393 link8394 link8395 link8396 link8397 link8398 link8399
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