Hallo , ich bin gerade auf der suche nach einer eleganteren Möglichkeit die Bits meines Structs mit einen Wert zu belegen struct{ unsigned _1:1; unsigned _2:1; unsigned _3:1; unsigned _4:1; unsigned _5:1; unsigned _6:1; unsigned _7:1; unsigned _8:1; }volatile lamp; lamp= 20; bringt mir leider eine Fehlermeldung geht es überhaupt so oder muss ich jedes bit einzeln setzen? Danke im vorraus
Nein, das geht so nicht. Die Größe deiner Struktur ist nicht definiert. Ansonsten könnte man mit Zeigern spielen:
1 | #include <stdio.h> |
2 | |
3 | int main() { |
4 | struct la { |
5 | unsigned _1:1; |
6 | unsigned _2:1; |
7 | unsigned _3:1; |
8 | unsigned _4:1; |
9 | unsigned _5:1; |
10 | unsigned _6:1; |
11 | unsigned _7:1; |
12 | unsigned _8:1; |
13 | };
|
14 | |
15 | unsigned char v = 8; |
16 | struct la *z = (struct la *) &v; |
17 | |
18 | printf("bit 1 = %i\n", z->_1); |
19 | printf("bit 2 = %i\n", z->_2); |
20 | printf("bit 3 = %i\n", z->_3); |
21 | printf("bit 4 = %i\n", z->_4); |
22 | printf("bit 5 = %i\n", z->_5); |
23 | printf("bit 6 = %i\n", z->_6); |
24 | printf("bit 7 = %i\n", z->_7); |
25 | printf("bit 8 = %i\n", z->_8); |
26 | |
27 | return 0; |
28 | }
|
versuch mal union { unsigned char byte; struct { unsigned _1:1; unsigned _2:1; unsigned _3:1; unsigned _4:1; unsigned _5:1; unsigned _6:1; unsigned _7:1; unsigned _8:1; }; }lamp; entweder lamp.byte = 0; und alle bits sind wech oder einzeln setzen mit lamp._8 = 1; und 8tes bit ist 1 byte und die _1 bis _8 belegen den selben speicherbereich können sich also überschreiben aber so kann man ein bitfeld komplet löschen
gast schrieb: > versuch mal > ... > lamp.byte = 0; > und alle bits sind wech oder einzeln setzen mit > lamp._8 = 1; und 8tes bit ist 1 nö, das 7-te Bit ist dann 1. Bits beginnt man bei 0 zu zählen. Anonyme Strukturen sind eine Spezialität von GNU-C. Johann
Johann L. schrieb: > Anonyme Strukturen sind eine Spezialität von GNU-C. Der RealView Compiler (u.a. Keil MDK) unterstützt das ebenfalls, wenn man ein bestimmtes pragma verwendet: http://infocenter.arm.com/help/topic/com.arm.doc.kui0098a/armccref_ciajccbj.htm Gut möglich, dass die Kommandozeilenoption --gnu neben weiteren GCC features auch dieses aktiviert. Sicher bist Du auf jeden Fall, wenn Du das hier verwendest:
1 | union
|
2 | {
|
3 | unsigned char byte; |
4 | struct
|
5 | {
|
6 | unsigned _1:1; |
7 | unsigned _2:1; |
8 | unsigned _3:1; |
9 | unsigned _4:1; |
10 | unsigned _5:1; |
11 | unsigned _6:1; |
12 | unsigned _7:1; |
13 | unsigned _8:1; |
14 | } bits; |
15 | } lamp; |
16 | |
17 | |
18 | lamp.byte = 0; |
19 | lamp.bits._1 = 1; |
Gruß Marcus http://www.doulos.com/arm/
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.