zu _R2D2:
Ich habe generell bei meinen Bitdefinitionen einen "int" genommen, da dies dem ANSI-C Standard entspricht.
Wenn ich die Optionen meinens Compilers entsprechund umstelle, kann ich natürlcih auch ein "char" benutzen und in diesem Beispiel 3 Bytes sparen. In meinem Falle werden für die beiden Bits gleich 4 Bytes belegt. 32 Bit Architektur für den LPC1768. Ist hier aber egal, es geht mir nur um das Prinzip. Ich finde es sehr Schade, daß der Compiler keine Warnung auslöst, wenn ich einem einzelnen Bit eine 2, oder einer 3-Bit Definition Werte größer als 7 zuweise. Verblüffend ist, daß der Compiler aber die erforderlichen Bits trotzdem richtig ausmarkiert, er überschreibt also keine "falschen" Bits, innerhalb der Struktur. Immerhin werden das auch gleich 6 Assemblerzeilen für "bits.a = 1;"
------------------------------
für Moebius:
Du kannst ein Byte z.B. wie folgt definieren:
struct
{
char a : 1; /* a hat 1 Bit */
char b : 4; /* b hat 4 Bits */
char c : 2; /* c hat 2 Bits */
char d : 1; /* d hat 1 Bit */
} bits;
nun kannst du vom Programm aus folgendes tun:
bits.a = 1;
bits.b = 0x0F;
bits.c = 3;
bits.d = 0;
Hier hast Du im Prinzip der Variablen "bits" den Wert 127 dezimal zugewiesen.
was leider nicht so ohne weiteres geht, ist der direkte Zugriff auf das gesamte Byte:
bits = 127;
hier könnte man sich mit folgender "unleserlichen" Variante helfen.
*(char*)(&bits) = 127;
oder gibt es vielleicht doch noch eine andere Möglichkeit ????
Ich bin ja auch noch ein "Frischling" was "C" angeht.
Version 2 könnte vielleicht so aussehen:
Code:
union
{
struct
{
char a : 1; /* a hat 1 Bit */
char b : 4; /* b hat 4 Bits */
char c : 2; /* c hat 2 Bits */
char d : 1; /* d hat 1 Bits */
} bits;
char value;
} bitstruct;
int main(void)
{
bitstruct.bits.a = 1;
bitstruct.bits.b = 0x0F;
bitstruct.bits.c = 3;
bitstruct.bits.d = 0;
bitstruct.value = 127; /* auf alle Bits gleichzeitig zugreifen */
}
Siro
Lesezeichen