union, struct & Bitfelder

Gast #2194896
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
Gast #2194907
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.
Gast #2194966
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
Gast #2195013
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.

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