Forum: PC-Programmierung Struktur in Union initialisieren


von Mirco G. (mirco432)


Angehängte Dateien:

Lesenswert?

Hi. Ich möchte für die nachfolgende union so inititalisieren das überall 
eine 1 steht.
1
union S_Control_t{
2
3
  struct SCTL_t{
4
5
    //S Control Register Group A
6
7
      unsigned int SCTL1 :4;
8
      unsigned int SCTL2 :4;
9
10
      unsigned int SCTL3 :4;
11
      unsigned int SCTL4 :4;
12
13
      unsigned int SCTL5 :4;
14
      unsigned int SCTL6 :4;
15
16
      unsigned int SCTL7 :4;
17
      unsigned int SCTL8 :4;
18
19
      unsigned int SCTL9 :4;
20
      unsigned int SCTL10 :4;
21
22
      unsigned int SCTL11 :4;
23
      unsigned int SCTL12 :4;
24
25
      //S Control Register Group B  
26
27
      unsigned int SCTL13 :4;
28
      unsigned int SCTL14 :4;
29
30
      unsigned int SCTL15 :4;
31
      unsigned int SCTL16 :4;
32
33
      unsigned int SCTL17 :4;
34
      unsigned int SCTL18 :4;
35
36
  }SCTL_b;
37
38
  struct SCTRL_t{
39
40
            //S Control Register Group A
41
              uint8_t SCTRL_2_1;
42
              uint8_t SCTRL_4_3;
43
              uint8_t SCTRL_6_5;
44
              uint8_t SCTRL_8_7;
45
              uint8_t SCTRL_10_9;
46
              uint8_t SCTRL_12_11;
47
48
              //S Control Register Group B
49
              uint8_t SCTRL_14_13;
50
              uint8_t SCTRL_16_15;
51
              uint8_t SCTRL_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

: Verschoben durch Moderator
von sid (Gast)


Lesenswert?

Hi,
kannst Du mal eine Zeile posten in der Du das "wie im Bild" 
initialisierst?

das würde helfen die banalsten Fehler auszuschliessen.

'sid

von fop (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

Was auch helfen würde, ist eine etwas genauere Definition von

Mirco G. schrieb:
> Irgendwie will das aber alles nicht so richtig funktionieren.

von Thomas W. (goaty)


Lesenswert?

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.

: Bearbeitet durch User
von Eric B. (beric)


Lesenswert?

1
#include <stdint.h>
2
#include <stdio.h>
3
4
union {
5
  struct {
6
    uint8_t a_1;
7
  } a;
8
9
  struct {
10
    uint8_t b_1: 4;
11
    uint8_t b_2: 4;
12
  } b;
13
} ab = {
14
  .b.b_1 = 1,
15
  .b.b_2 = 5
16
};
17
18
int main() {
19
    printf("%d", ab.a_1);
20
}
output: 81

: Bearbeitet durch User
von Mirco G. (mirco432)


Angehängte Dateien:

Lesenswert?

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?

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von GEKU (Gast)


Lesenswert?


von GEKU (Gast)


Lesenswert?


von Mirco G. (mirco432)


Lesenswert?

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...

von zitter_ned_aso (Gast)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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?

von Eric B. (beric)


Lesenswert?

Yalu X. schrieb:
> sollte aber wohl
>
>     printf("%d", ab.a.a_1);
>
> lauten.

Stimmt. Zoppie-Pasta Fehler. Mea Culpa!

Yalu X. schrieb:
> Ich kann das Problem bei mir leider nicht reproduzieren.

Ich auch nicht: https://godbolt.org/z/BfTQJc

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.