[elektro] C-ben bit struktura kérdés

Moczik Gabor pm_levlista at progzmaster.hu
Thu Jun 12 12:08:44 CEST 2008


Papp Zoltán wrote:
> {
>    unsigned char
>      fbits0:5,
>      fbits1:5,
>      fbits2:3,
>      fbits3:3;
> };
> Van olyan fordító, ami sorrendben pakolja a bájtokba a biteket, így az  
> első 5-bites cuccot 1 bájtba, majd utána már nem fér be a köv. 5 bit, így  
> azt köv. bájtba, majd a két 3-biteset egy újabba. Így 3 bájtot fog  
> elfoglalni. De ha a fordító okos, akkor rájöhet, hogy átrendezve a  
> sorrendet belefér 2 bájtba is, ezzel memóriát spórol, de fogalmad sem  
> lesz, mi hova kerül.

Altalaban a bitmezoket azert hasznalja az ember hogy egy hardver elem 
regiszereit lekepezze vele, vagy takarekoskodni kell a memoriaval. Elobbi 
esetben az atrendezesnek csak hatranya lenne, az utobbiban meg gondolkodhat 
a programozo is, 8-asaval csoportositani nem olyan nehez :-)
Ha esetleg az eeprom-ban kell tarolni, akkor meg ismet nagy baj van ha a 
fordito ossze-vissza rendezgeti mert a struktura veget kiegeszitetted 1 bittel.

Letezik valami 'packed' vagy '__packed' modosito, ami arra utasitja a 
forditot hogy ne okoskodjon, ne igazitsa szohatarra, ne rendezgessen, rakja 
le sorban ugy ahogy irtam.
Utana kene nezni hogy ez fordito-specifikus vagy szabvanyos. Mindenesetre en 
pont az ilyen anomaliak miatt ritkan hasznalom a bitmezoket, inkabb #define 
meg bitmuvelet...

#define BUSY_FLAG  0x80

if ((STATUS&BUSY_FLAG)==0) ...


> Mintahogy pl. van a köv.:
> 
> char a;
> int b;
> float c;
> 
> Fogalmad sincs, hogy hova kerülnek ezek a memóriába, és milyen sorrendben.

Viszont itt nem is fontos.

> Ha biztos akarsz lenni a dolgodban, hogy egy adott bájt 3. bitjét állítod  
> be 1-be, akkor csak a X|=1<<3 a megoldás.
> Ezt pl. az IAR C for AVR fordító egy "ORI R16,0x08" utasítássá fordítja  
> le, azaz a leghatékonyabb kódot generálja. És ezt már akkor is, ha nincs  
> bekapcsolva semmilyen fordítási optimalizálás.

Ezt a legtobb fordito tudja, de kod olvashatosag es erthetoseg szempontjabol 
szerintem jobb a fenti define-os bit megnevezes...

-- 
((( Móczik Gábor  )))--((( E~mail: "pm-01" @AT "progzmaster" .DOT "hu" )))
((( Skype: moczik )))



More information about the Elektro mailing list