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