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;
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.