www.mikrocontroller.net

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


Autor: alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der offizielle Weg: man nimmt eine union.
#include <stdint.h>

union bitbyte {
  uint8_t byte;
  struct {
    uint8_t b0: 1;
    uint8_t b1: 1;
    /* ... */
    uint8_t b7: 1;
  } bits;
};

union bitbyte x;
uint8_t y;

...
  x.bits.b0 = 1;
  x.bits.b1 = 0;

  y = x.byte;

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

Autor: alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke für die hilfe. wo kann man denn sowas nachlesen?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: alex (Gast)
Datum:

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

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kernighan and Richie...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.