anfänger frage..bitfelder

Gast #363381
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
Moderator Persönliche Seite #363382
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.
#363387
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.
#363389
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren