Forum: Compiler & IDEs anfänger frage..bitfelder


von alex (Gast)


Lesenswert?

Hallo. Wie kann man den Inhalt eines Bitfeldes in einer anderen
variablen abspeichern?
***************************************************************
Beispiel:

int main (void)
{ unsigned char x;

    struct {unsigned char rot  :1;
            unsigned char gelb :1;
            unsigned char gruen :1;
          } ampel;

      ampel.rot  = 0;
      ampel.gelb = 0;
   x=ampel;   // DAS FUNKTIONIERT NICHT
    return (0);
}
*****************************************************
ein CAST hilft auch nicht weiter..
Danke schonmal für eure Hilfe

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Der offizielle Weg: man nimmt eine union.
1
#include <stdint.h>
2
3
union bitbyte {
4
  uint8_t byte;
5
  struct {
6
    uint8_t b0: 1;
7
    uint8_t b1: 1;
8
    /* ... */
9
    uint8_t b7: 1;
10
  } bits;
11
};
12
13
union bitbyte x;
14
uint8_t y;
15
16
...
17
  x.bits.b0 = 1;
18
  x.bits.b1 = 0;
19
20
  y = x.byte;

Beachte aber, dass die Anordnung der Bits implementierungsabhängig
ist.

von alex (Gast)


Lesenswert?

ok danke für die hilfe. wo kann man denn sowas nachlesen?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> wo kann man denn sowas nachlesen?

Hmm.  Weiß ich nicht, man weiß es einfach. ;-)

In meinem K&R steht am Ende des Kapitels über structures ein
wenig darüber.  Der Fall, eine union aus einem bitfield und
einem größenäquivalenten Integer für irgendwas zu benutzen,
ist aber dort nicht erwähnt.

von alex (Gast)


Lesenswert?

letzte Frage... "In meinem K&R steht am Ende des Kapitels ..."
wofür steht das K&R ?

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Kernighan and Richie...

von Karl H. (kbuchegg)


Lesenswert?

> Der offizielle Weg: man nimmt eine union.

Na ja. So offiziell ist der aber nicht.
Offiziell darfst Du das nämlich nicht. Das Ergebnis
ist undefiniert.
Aus einer union darfst du immer nur ueber den selben
Weg was rauslesen über den Du auch hineingeschrieben
hast.

Ich weiss, ich weiss. Ich kenn auch keinen Compiler
beim dem das nicht funktionieren wuerde.
Nur: Der offizielle C-Sprachstandard verbietet dir
das eigentlich.

von Simon K. (simon) Benutzerseite


Lesenswert?

Aus einer union darfst du immer nur ueber den selben Weg was rauslesen
über den Du auch hineingeschrieben hast.


Wuat? Dann bräuchte man ja keine Unions mehr.
Ist doch genau dafür da! Nimmst ne 16Bit Variable in ne Union mit 2
8Bit Variablen. Und schon kannste 16bit schreiben und 2*8bit einzeln
rauslesen.

von Karl H. (kbuchegg)


Lesenswert?

> Ist doch genau dafür da!

Nein. Genau dafuer ist eine union eben nicht da
auch wenn sie meist (in heutiger Zeit) dafuer benutzt
wird.

unions stammen noch aus der Zeit als man mit Speicherplatz
geizen musste. Wenn man wusste, dass 2 oder mehr Variablen
nicht zur selben Zeit benoetigt wurden, dann legte man
sie mit einer union 'uebereinander' und hat damit Speicher
eingespart. (Wer kann sich noch an die Zeit erinnern, als
man dasselbe mit Code machte?)

Der Grund warum das Verhalten undefiniert ist, sind
diverse 'Trap-Repraesentierungen' wo du in eine union
ueber einen Weg einen Wert reinschreibst und Dir nichts
und niemand (auch nicht der C-Standard) garantieren kann,
dass du ueber den Abfrageweg ueber einen anderen Datentyp
ueberhaupt irgendetwas sinnvolles lesen kannst oder das
System einfach gleich abschmiert. In solchen Faellen haelt
sich der C-Standard immer raus und erklaert das Verhalten
als undefiniert, was soviel heist wie: alles moegliche
kann passieren inklusive das Zeug funktioniert so wie du
es erwartest. Aber garantiert ist gar nichts.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.