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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.