Hi. Ich möchte für die nachfolgende union so inititalisieren das überall
eine 1 steht.
1
unionS_Control_t{
2
3
structSCTL_t{
4
5
//S Control Register Group A
6
7
unsignedintSCTL1:4;
8
unsignedintSCTL2:4;
9
10
unsignedintSCTL3:4;
11
unsignedintSCTL4:4;
12
13
unsignedintSCTL5:4;
14
unsignedintSCTL6:4;
15
16
unsignedintSCTL7:4;
17
unsignedintSCTL8:4;
18
19
unsignedintSCTL9:4;
20
unsignedintSCTL10:4;
21
22
unsignedintSCTL11:4;
23
unsignedintSCTL12:4;
24
25
//S Control Register Group B
26
27
unsignedintSCTL13:4;
28
unsignedintSCTL14:4;
29
30
unsignedintSCTL15:4;
31
unsignedintSCTL16:4;
32
33
unsignedintSCTL17:4;
34
unsignedintSCTL18:4;
35
36
}SCTL_b;
37
38
structSCTRL_t{
39
40
//S Control Register Group A
41
uint8_tSCTRL_2_1;
42
uint8_tSCTRL_4_3;
43
uint8_tSCTRL_6_5;
44
uint8_tSCTRL_8_7;
45
uint8_tSCTRL_10_9;
46
uint8_tSCTRL_12_11;
47
48
//S Control Register Group B
49
uint8_tSCTRL_14_13;
50
uint8_tSCTRL_16_15;
51
uint8_tSCTRL_18_17;
52
53
}SCTRL_s;
54
55
}S_Control_u;
Ich hab das schon wie in dem angehängten Bild probiert. Irgendwie will
das aber alles nicht so richtig funktionieren.
Wie würdet ihr das machen ?
Danke
Könnte sein, dass Dein Compiler den C99 Standard nicht versteht oder
nicht verstehen will, weil Du was anderes eingestellt hast.
Kann aber auch fehlerhafter Code von Dir sein, weil Du was falsch
verstanden hast.
Du mußt auch sagen ob es C, oder C++ und welcher Standard. 98, 11, 17 ?
Initialisieren kannst du es aber so:
letzte Zeile:
}S_Control_u = {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0};
Weil der Initializer auf die erste struct im union geht, und das sind
nibbels.
Entschuldigt das ich mich erst jetzt wieder melde.
Ich war im Urlaub und vorher noch im KH :(.
Ich schreibe in C. Ich nutze STM32Cube. An den Standards hatte ich
nichts geändert. Vorher war da einfach nichts eingestellt. Dann hab ich
es mal auf C99 umgestellt. Die Fehler bleiben gleich.
Eric B. schrieb:> #include <stdint.h>> #include <stdio.h>>> union {> struct {> uint8_t a_1;> } a;>> struct {> uint8_t b_1: 4;> uint8_t b_2: 4;> } b;> } ab = {> .b.b_1 = 1,> .b.b_2 = 5> };>> int main() {> printf("%d", ab.a_1);> }
Bekomme ich genau die gleichen fehler.
First defined in Zeile "} ab = {" und in der gleichen Zeile multiple
definition of ´ab´
Thomas W. schrieb:> Du mußt auch sagen ob es C, oder C++ und welcher Standard. 98, 11, 17 ?>> Initialisieren kannst du es aber so:>> letzte Zeile:>> }S_Control_u = {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0};>> Weil der Initializer auf die erste struct im union geht, und das sind> nibbels.
Genau der gleiche Fehler.
Noch jemand eine Idee?
Mirco G. schrieb:> First defined in Zeile "} ab = {" und in der gleichen Zeile multiple> definition of ´ab´
"multiple definition of 'ab'" heißt, es gibt mehr als eine Definition
von ab. Da Erics Code aber nur eine einzige Definition von 'ab' enthält,
hast du vermutlich selber (absichtlich oder unabsichtlich) eine weitere
hinzugefügt.
Die Zeile
1
printf("%d",ab.a_1);
sollte aber wohl
1
printf("%d",ab.a.a_1);
lauten.
Mirco G. schrieb:> Thomas W. schrieb:>> ...>> }S_Control_u = {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0};>> ...>> Genau der gleiche Fehler.
Im Vorschlag von Thomas kommt 'ab' überhaupt nicht vor, also kann
unmöglich dieselbe Fehlermeldung ausgegeben werden.
Yalu X. schrieb:> "multiple definition of 'ab'" heißt, es gibt mehr als eine Definition> von ab. Da Erics Code aber nur eine einzige Definition von 'ab' enthält,> hast du vermutlich selber (absichtlich oder unabsichtlich) eine weitere> hinzugefügt.
Ne hab ich aber nicht. Gerade nochmal alles durchgeschaut. Ich habe
nichts mit dem namen "ab" angelegt.
Yalu X. schrieb:> Im Vorschlag von Thomas kommt 'ab' überhaupt nicht vor, also kann> unmöglich dieselbe Fehlermeldung ausgegeben werden.
I.d.F. meinte ich natürlich multiple definition of S_Control_u
Ich habe kein _attribute_ verwendet.
Habe eben einfach mal mit alligned und packed getestet aber das hat auch
nix gebracht. Ich weiß ja auch nicht wie die Daten für = {0,1,0,1} im
speicher liegen müssen...
Mirco G. schrieb:> union so inititalisieren das überall> eine 1 steht.
wie soll da eigentlich überall eine 1 stehen?
Wenn die beiden Nibbles eine 1 enthalten (0001) dann hat das gesamte
Byte (ohne alignment) den Wert 00010001. Und das ist keine 1, sondern
17.
Mirco G. schrieb:> Ne hab ich aber nicht. Gerade nochmal alles durchgeschaut. Ich habe> nichts mit dem namen "ab" angelegt.
Ich kann das Problem bei mir leider nicht reproduzieren. Kannst du mal
dein vollständiges Testprogramm mitsamt den verwendeten Compileroptionen
und den genauen Fehlermeldungen posten?