Union Struct Fehler

Gast #3301180
Liebe Kollegen!

Kann mir jemand sagen wo der Fehler liegt?
1
union fnc_lat
2
{
3
  struct {
4
  unsigned int cb      :2;    // Control Bit
5
  unsigned int cr      :1;    // Counter Reset
6
  unsigned int pd1    :1;    // Power Down 1
7
  unsigned int mux    :3;    // MUX Control
8
  unsigned int pcp    :1;    // PD Polarity
9
  unsigned int cdt    :1;    // CP Threestate
10
  unsigned int fe      :1;    // Fastlock Enable
11
  unsigned int fm      :1;   // Fastlock Mode
12
  unsigned int tcc    :4;    // Timer Counter Control
13
  unsigned int cs1    :3;   // Current Setting 1
14
  unsigned int cs2    :3;    // Current Setting 2
15
  unsigned int pd2    :1;    // Power Down 2
16
  unsigned int pv      :2;    // Prescaler Value
17
} BITS;
18
  uint32_t RAW;
19
}
20

21
//Init
22

23
union fnc_lat i_lat_init = {3,0,0,0,0,0,0,0,0,0,0,0,0};
24

25

26
union fnc_lat i_lat_save = i_lat_init; //FEHLER: expression must have a constant value
Gast
Gerhard schrieb:
> } BITS;
>   uint32_t RAW;
> }

zu

  uint32_t RAW;
}bob;

semi, keine anonyme Union

>
> //Init
>
> union fnc_lat i_lat_init = {3,0,0,0,0,0,0,0,0,0,0,0,0};
>

union fnc_lat i_lat_init = {{3,0,0,0,0,0,0,0,0,0,0,0,0}};


> union fnc_lat i_lat_save = i_lat_init; //FEHLER: expression must have a
> constant value

funktioniert.

i_lat_save.BITS.cb hat den Wert 3.
Gast
wenn ich const union ... schreibe geht es auch nicht.
Darf ich nur Werte nehmen??
1
union fnc_lat
2
{
3
  struct {
4
  unsigned int cb      :2;    // Control Bit
5
  unsigned int cr      :1;    // Counter Reset
6
  unsigned int pd1    :1;    // Power Down 1
7
  unsigned int mux    :3;    // MUX Control
8
  unsigned int pcp    :1;    // PD Polarity
9
  unsigned int cdt    :1;    // CP Threestate
10
  unsigned int fe      :1;    // Fastlock Enable
11
  unsigned int fm      :1;   // Fastlock Mode
12
  unsigned int tcc    :4;    // Timer Counter Control
13
  unsigned int cs1    :3;   // Current Setting 1
14
  unsigned int cs2    :3;    // Current Setting 2
15
  unsigned int pd2    :1;    // Power Down 2
16
  unsigned int pv      :2;    // Prescaler Value
17
} BITS;
18
  uint32_t RAW;
19
}
20

21
//Init
22

23
const union fnc_lat i_lat_init = {3,0,0,0,0,0,0,0,0,0,0,0,0};
24

25

26
union fnc_lat i_lat_save = i_lat_init; //FEHLER: expression must have a constant value
Gast
Gerhard schrieb:
> } BITS;
>   uint32_t RAW;
> };
1. fehlt da bei dir das Semikolon
> const union fnc_lat i_lat_init = {{3,0,0,0,0,0,0,0,0,0,0,0,0}};
2. Müssen da doppelte {{ und }} hin

3.: Kompiliere einfach mit C++, da geht sowas. Schreibe dann auch 
"constexpr" vor die letzte Zeile um sicherzustellen, dass die "statisch" 
initialisiert wird.
Gast
Das fehlende Semikolon ist beim kopieren verschwunden. Im Code steht es.
Cool, dass dir das aufgefallen ist.

Ich habe es so gelöst:
1
union fnc_lat
2
{
3
  struct {
4
  unsigned int cb      :2;    // Control Bit
5
  unsigned int cr      :1;    // Counter Reset
6
  unsigned int pd1    :1;    // Power Down 1
7
  unsigned int mux    :3;    // MUX Control
8
  unsigned int pcp    :1;    // PD Polarity
9
  unsigned int cdt    :1;    // CP Threestate
10
  unsigned int fe      :1;    // Fastlock Enable
11
  unsigned int fm      :1;   // Fastlock Mode
12
  unsigned int tcc    :4;    // Timer Counter Control
13
  unsigned int cs1    :3;   // Current Setting 1
14
  unsigned int cs2    :3;    // Current Setting 2
15
  unsigned int pd2    :1;    // Power Down 2
16
  unsigned int pv      :2;    // Prescaler Value
17
} BITS;
18
  uint32_t RAW;
19
} ;
20

21
//Init
22

23

24
#define init_i{{3,0,0,0,0,0,0,0,0,0,0,0,0}}
25

26
const union fnc_lat i_lat_init = init_i;
27

28
union fnc_lat i_lat_save = init_i;

DANKE! für Eure Hilfe!
Gast
DirkZ schrieb:
> ich schreib's nochmal: keine anonyme Union, Semikolon fehlt.
Die union ist nicht anonym, sie heißt "fnc_lat". Dein vorschlag würde 
gleich eine Instanz anlegen; das will er an der Stelle aber gar nicht.

DirkZ schrieb:
> ich schreib's nochmal:
Naja, dein 1. Post war nicht gerade... verständlich

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.