Forum: Compiler & IDEs union, struct & Bitfelder


von Rufus (Gast)


Lesenswert?

Hallo!

Habe eine 16bit-Integer zahl, die aus Bitmasken gebildet wird.
Das MSB ist eine Maske, das LSB wird durch zwei Bitmasken gebildet.
Nun wurde ich gern eine Union/Struct anlegen, mit deren Hilfe ich mit 
einem Datentyp auf alles Zugreifen kann.

Wie mache ich das?
1
typedef struct MyDataTypeStruct
2
{
3
  union
4
  {
5
    unsigned int Value;
6
    unsigned char VRU : 8;
7
    unsigned char HRU : 4;
8
    unsigned char LRU : 4;
9
 }
10
} MyDataType;

Funktioniert irgendwie nicht.

Danke für eure Hilfe.

Gruß
Rufus

von DirkB (Gast)


Lesenswert?

Alle deine Elemente werden auf den selben Speicher abgebildet. LRU ist 
das Selbe wie HRU.

Du musst deine xRU's in einer struct zusammenfassen (am besten noch 
gepackt) und diese dann mit Value in eine union stecken.

Das kann funktionieren, muss es aber nicht.

von DirkB (Gast)


Lesenswert?

Schau auch mal hier: Beitrag "Wert in array ablegen"
(Fast das Gleiche.)

von Rufus (Gast)


Lesenswert?

Also quasi so:
1
typedef struct MyDataTypeMaskStruct
2
{
3
    unsigned char VRU : 8;
4
    unsigned char HRU : 4;
5
    unsigned char LRU : 4;
6
} MyDataTypeMask;
7
8
union
9
{
10
  unsigned int Value;
11
  MyDataTypeMask mask;
12
} MyDataType;

Und das passt dann auch mit der Maskierung?

Gruß
Rufus

von Rolf Magnus (Gast)


Lesenswert?

Rufus schrieb:
> Und das passt dann auch mit der Maskierung?

Es kann paasen, oder auch nicht. Was da genau rauskommt, kann der 
Compiler selbst entscheiden, und es hängt auch vom Prozessor ab. 
Eigentlich ist es in C verboten, ein anderes Union-Element zu lesen, als 
das, in das man als letztes geschrieben hat. Dazu kommen dann noch 
prozesorspezifisches Aligment, Padding und die Größen der Datentypen.

von Rolf Magnus (Gast)


Lesenswert?

... und natürlich noch Endianness.

von Rufus (Gast)


Lesenswert?

Mir wird's schlecht.
Kann man den Compiler nicht irgendwie zu der richtigen/gewünschten 
Maskierung zwingen?

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


Lesenswert?

Rufus schrieb:
> Kann man den Compiler nicht irgendwie zu der richtigen/gewünschten
> Maskierung zwingen?

Nein.  Der C-Standard stellt üblicherweise Effektivität vor die
Portabilität auf niedrigster Ebene.

von DirkB (Gast)


Lesenswert?

Letztendlich ist es doch egal ob Du oder der Compiler das maskieren und 
schieben hinschreibt.

Du kannst dir ja auch Makros definieren, die das machen.

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.