Forum: Compiler & IDEs UNION


von Andreas (Gast)


Lesenswert?

Hey Leute ich will bei einer 16 Bit Variable auf einzelne Bits oder die
gesamte Variable zugreifen  ich habe das so gemacht:

warum geht dass nicht ? mit WINAVR

typedef union
{
   unsigned char bit_1:1; // 1. Bit
   unsigned char bit_2:1; // 2. Bit
   unsigned char bit_3:1; // 3. Bit
   unsigned char bit_4:1; // 4. Bit
   unsigned char bit_5:1; // 5. Bit
   unsigned char bit_6:1; // 6. Bit
   unsigned char bit_7:1; // 7. Bit
   unsigned char bit_8:1; // 8. Bit
   unsigned char bit_9:1; // 9. Bit
   unsigned char bit_10:1; // 10. Bit
   unsigned char bit_11:1; // 11. Bit
   unsigned char bit_12:1; // 12. Bit
   unsigned char bit_13:1; // 13. Bit
   unsigned char bit_14:1; // 14. Bit
   unsigned char bit_15:1; // 15. Bit
   unsigned char bit_16:1; // 16. Bit
   unsigned short bitfield;// ganze Variable
}manchester_bitfield;

von Tobias (Gast)


Lesenswert?

Mußt du nicht jeweils das char weglassen?

von Andreas (Gast)


Lesenswert?

steht mal so im GCC Tutorial

von A.K. (Gast)


Lesenswert?

Das "char" ist hier nicht das Problem. Eher schon, dass alle 16 Bits
an der selben Stelle stehen.

Bitfields sind tendentiell eher Problem als Lösung. Masken sehen nicht
so elegant aus, dafür funktionieren sie. Und kommen ohne solche
schauderhaften overlay unions aus.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du vermischt hier zwei Dinge, ein Bitfeld und eine Union.

Das geht so nicht, da eine Union die Überlagerung aller einzelnen
Elemente ist (das wäre hier also eine Überlagerung aller einzelnen
Bits), Du aber willst ein Bitfeld und eine andere Variable überlagern.

Das sollte so gehen:
1
typedef union 
2
{
3
  struct
4
  {
5
    unsigned short bit_1:1; // 1. Bit 
6
    unsigned short bit_2:1; // 2. Bit 
7
    unsigned short bit_3:1; // 3. Bit 
8
    unsigned short bit_4:1; // 4. Bit 
9
    unsigned short bit_5:1; // 5. Bit 
10
    unsigned short bit_6:1; // 6. Bit 
11
    unsigned short bit_7:1; // 7. Bit 
12
    unsigned short bit_8:1; // 8. Bit 
13
    unsigned short bit_9:1; // 9. Bit 
14
    unsigned short bit_10:1; // 10. Bit 
15
    unsigned short bit_11:1; // 11. Bit 
16
    unsigned short bit_12:1; // 12. Bit 
17
    unsigned short bit_13:1; // 13. Bit 
18
    unsigned short bit_14:1; // 14. Bit 
19
    unsigned short bit_15:1; // 15. Bit 
20
    unsigned short bit_16:1; // 16. Bit 
21
  };
22
  unsigned short bitfield;// ganze Variable
23
} manchester_bitfield;

Das Bitfeld ist in einer anonymen Struktur verpackt und damit sollte es
funktionieren.

Im übrigen ist es ratsam, Bits korrekt durchzunumerieren. C ist nicht
Pascal, also ist das erste Bit "Bit 0" und nicht "Bit 1", ebenso
wie das letzte Bit nicht "Bit 16", sondern "Bit 15" ist.

Einfach angewöhnen, das hilft spätere Fehler zu vermeiden.

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.