[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