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

Papp Zoltán zombi at c2.hu
Thu Jun 12 11:39:18 CEST 2008


2008.06.12. 11:01:17 dátumon Palasik Sandor <palasik at mail.datanet.hu> írta:

>>> union {
>>>           unsigned int A;
>>>           struct {
>>>              bit0:1;
>>>              bit1:1;
>>>              bit2:1;
>>>            }
>>>          } WORD;
>> Nem teljesen ertem a feladatot. Miert kell ket kulonbozo elnevezest
>> hasznalni? WORD.A ^= 3<<WORDbit1;
>> Helyett miert nem jo a WORD.bit2^=1 ?
>
> Szerintem az egész struktúrát egy konstanssal szeretné feltölteni és nem
> bitenként értékadással, esetleg több bitet piszkálni egyszerre, egy
> utasítással. Tudtommal erre nincs megoldás, a bitnek nincs "címe".

Illetve van, csak az nem "publikus". A fordító saját magának generálja, de  
a szabványban nincs leírva, hogy azt hol is és hogyan kell tárolnia a  
memóriában.
Egyébként ez azért van így, mert pl. van az alábbi bitmező:
struct
{
   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. 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.
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.

Üdv


-- 
Papp Zoltán
OneWay Electronics Kft
Hangszerviz



More information about the Elektro mailing list