[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