[elektro] C-ben bit struktura kérdés
Papp Zoltán
zombi at c2.hu
Thu Jun 12 11:27:40 CEST 2008
2008.06.12. 09:17:28 dátumon hg12345 <hg12345 at freemail.hu> írta:
> Hi!
>
> A bit strukturák és a hozza tartozó define-k összekapcsolására van
> szabványos megoldás. (nem találtam :-)
Hát nyelvtani szerkezetek híjján nehezen érthető, mit is akarsz.
De megpróbálom.
> pl.:
>
> union {
> unsigned int A;
> struct {
> bit0:1;
> bit1:1;
> bit2:1;
> }
> } WORD;
>
> #define WORDbit0 0
> #define WORDbit1 1
>
> vagy
> enum eWORD{WORDbit0=0,WORDbit1,WORDbit2};
>
> WORD.A ^= 3<<WORDbit1;
>
> A fenti megoldásra szeretnék egy olyat a bitstrukturából tudja kinyerni
> a bit poziciót.
Ha bit-mezőket akarsz használni, akkor az mindenképen fordító-specifikus
lesz. Az ANSI C szabvány nem definiálja, hogy egy bitmezőban lévő biteket
hogyan és milyen sorrendben tárolja a memóriában. Sőt, ha pl. 32 bitet
tárolsz, nem definiált, hogy a 4 bájton hol lesz melyik bit.
Ámde ennek ellenére (gondolom) a legtöbb fordító sorrendben tárolja a
biteket, így sorban a 0. bittől hátrafelé. Ezt egyszer ki kell próbálni
adott fordítónál, utána a fordító már valószínűleg mindig ugyanúgy
fordítja le.
> (((Akár a forditott megoldás is jó, hogy a #define-ból előállítja a
> bitstrukturát, mondjuk ez kevésbó jó, mert sokkal macerásabb és
> érthetetlenebb, föleg ha minden bitnek eltérő neve van)))
>
> Lényeg hogy a két meghatározás szinkronban legyen egymással.
>
> Tudom létezik olyan C ami ismeri a bit szintű pointer, de erre nem
> vágyom. Amit eltudnék képzelni forditási idöben is létező sizeof()
> függvény ?
>
> Ez nem okoz problémát?
Pl. IAR C-ben (gondolom mást C-fordítóban is) van egy bitmeződ:
struct
{
unsigned char
fbit0:1,
fbit1:1,
fbits2:3;
};
Itt használhatod az alábbi formulákat:
fbit0=1;
fbit0=0;
if (fbit1) {...}
fbits2=6;
stb...
Az IAR C egyébként azt csinálja, hogy el kezdi feltölteni a bitmezőkkel
egy, a struct-ban megadott típusú memória-helyet. Amint az a következő
bitmezőtől túlcsordulna, akkor újat kezd.
Pl. az alábbi cucc 3 bájtot fog elfoglalni a memóriában, és értelemszerűen
nem lehet megadni 8-bitnél nagyobb bitmezőt:
struct
{
unsigned char
fbit0:5,
fbit1:5,
fbits2:5;
};
Ugyanez unsigned int-el írva csak 2 bájtot foglal el. (Ja, ennél a
procinál a char 8bit, az int 16bit széles)
Ha más volt a kérdésed, akkor bocs...
Üdv
--
Papp Zoltán
OneWay Electronics Kft
Hangszerviz
More information about the Elektro
mailing list