mikrocontroller.net

Forum: PC-Programmierung Struktur in Union initialisieren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Mirco G. (mirco432)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi. Ich möchte für die nachfolgende union so inititalisieren das überall 
eine 1 steht.
union S_Control_t{

  struct SCTL_t{

    //S Control Register Group A

      unsigned int SCTL1 :4;
      unsigned int SCTL2 :4;

      unsigned int SCTL3 :4;
      unsigned int SCTL4 :4;

      unsigned int SCTL5 :4;
      unsigned int SCTL6 :4;

      unsigned int SCTL7 :4;
      unsigned int SCTL8 :4;

      unsigned int SCTL9 :4;
      unsigned int SCTL10 :4;

      unsigned int SCTL11 :4;
      unsigned int SCTL12 :4;

      //S Control Register Group B  

      unsigned int SCTL13 :4;
      unsigned int SCTL14 :4;

      unsigned int SCTL15 :4;
      unsigned int SCTL16 :4;

      unsigned int SCTL17 :4;
      unsigned int SCTL18 :4;

  }SCTL_b;

  struct SCTRL_t{

            //S Control Register Group A
              uint8_t SCTRL_2_1;
              uint8_t SCTRL_4_3;
              uint8_t SCTRL_6_5;
              uint8_t SCTRL_8_7;
              uint8_t SCTRL_10_9;
              uint8_t SCTRL_12_11;

              //S Control Register Group B
              uint8_t SCTRL_14_13;
              uint8_t SCTRL_16_15;
              uint8_t SCTRL_18_17;

          }SCTRL_s;

}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
Autor: sid (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: fop (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was auch helfen würde, ist eine etwas genauere Definition von

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

Autor: Thomas W. (goaty)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Eric B. (beric)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#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);
}
output: 81

: Bearbeitet durch User
Autor: Mirco G. (mirco432)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

    printf("%d", ab.a_1);

sollte aber wohl

    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.

Autor: GEKU (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: GEKU (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Mirco G. (mirco432)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: zitter_ned_aso (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Eric B. (beric)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.