Posted By: Sheltem (Terra Guardian) on 'CZprogram'
Title:     Re: Poradi polozek struktury
Date:      Tue Sep 23 12:02:20 1997


Ahoj,

> typedef struct tagHERO {
>      LPSTR Name;
>      DWORD Life;
>      DWORD Magic;
>      BYTE  Str, Dex, Con, Int, Wis;
>      DWORD Attrs;
> } HERO;

> Mam jistotu, ze v pameti jsou polozky struktury umistene v tom poradi,
> v jakem jsem je definoval, nebo to zalezi na tom, jak si to prekladac
> rozmisti?

On si je nerozmisti, ale jenom je "PACKNE", coz znamena, ze polozky ve 
strukture zarovna na 32-bitu, aby na ne ( a taky pak ty dalsi ) mohl 
pristupovat porad dvaatricetibitove. Takze vlastne i takovej BYTE on 
reprezentuje v pameti jako DWORD, ale to ty navenek vlastne nevidis.. 

> vyzkousel v GCC, tak to nefungovalo...

Ano, protoze GCC ma defaultne nastavenej pack tusim na 4 - coz je presne 32 
bitova hranice. WATCOM ma default 1, ( a VisualC myslim taky ).
Je tusim jasne, ze ten sizeof(HERO) potom bohuzel presne neodpovida skutecne 
velikosti toho typu v pameti. sizeof jenom poscita velikosti datovejch 
polozek v tom typu, takze kontrukce typu :

fread ( &data, sizeof ( data_type ), 1, file ); 

proste nemusi vzdycky fungovat. ( u GCC ne, pokud nepridas k tem polozkam ten 
atribut ) 

Jak toto ovlivnit ?

V tvem pripade u GCC budes muset napsat strukturu HERO nasledovne :
 
typedef struct tagHERO {
   DWORD  atrrs __attribute__ ((packed));
} HERO;

a tak dale...

pokud by nekoho jeste zajimalo, jak zmenit hodnotu PACK u Watcomu ( a tusim, 
ze to samy plati i pro VC++ ), tak je to :

#pragma PACK(4)      - napriklad

Sheltem

Search the boards