Forum: Mikrocontroller und Digitale Elektronik Union Struct Fehler


von Gerhard (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

i_lat_init ist keine Konstante. Globale und statische Variablen kann man 
aber nur mit Konstanten initialisieren.

von DirkZ (Gast)


Lesenswert?

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.

von Gerhard (Gast)


Lesenswert?

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

von Gerhard (Gast)


Lesenswert?

Danke! Hab die zweite { schon dazugeschrieben.

von (prx) A. K. (prx)


Lesenswert?

Gerhard schrieb:
> wenn ich const union ... schreibe geht es auch nicht.

Weil ein "const" keine Konstante markiert, sondern eine konstante 
Variable. Das klingt zwar bescheuert, aber so haben die C Götter das mal 
eingetütet. Erst C++ hat da (ein wenig) ein Einsehen.

von Kindergärtner (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

Was auch in C geht:
#define 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;

von Kindergärtner (Gast)


Lesenswert?

A. K. schrieb:
> Was auch in C geht:
Es sei denn, er versucht danach intuitiv so etwas:
1
uint32_t X = i_lat_init.RAW;
Was natürlich fürchterlich in die Hose geht.

von Gerhard (Gast)


Lesenswert?

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!

von (prx) A. K. (prx)


Lesenswert?

Kindergärtner schrieb:
> Was natürlich fürchterlich in die Hose geht.

Klar, aber das sagt ihm dann schon der Compiler. Und so wie er es jetzt 
gemacht hat geht auch dies.

von Kindergärtner (Gast)


Lesenswert?

A. K. schrieb:
> Klar, aber das sagt ihm dann schon der Compiler.
Ja, durch unverständliche kryptische Error-Messages...
> Und so wie er es jetzt gemacht hat geht auch dies.
Ja, mit mehr Makros geht alles...

von DirkZ (Gast)


Lesenswert?

Gerhard schrieb:
> } BITS;
>   uint32_t RAW;
> }

ich schreib's nochmal: keine anonyme Union, Semikolon fehlt.

    uint32_t RAW;
 } beliebiger_name;

von Kindergärtner (Gast)


Lesenswert?

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

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.