Forum: Mikrocontroller und Digitale Elektronik Variable zu union casten


von Holger K. (holgerkraehe)


Lesenswert?

Hallo zusammen


Ich habe eine Union:
1
typedef union
2
{
3
  struct
4
  {
5
    uint8_t NLOAD   : 1;
6
    uint8_t FNLOAD   : 1;
7
    uint8_t VANLOAD     : 1;
8
   }
9
   uint8_t status
10
}reg02;

Nun möchte ich die variable tmp als diese union interpretieren.
1
uint8_t tmp
2
....
3
((reg02)tmp).NLOAD = 1;

Weshalb geht das so nicht?

Danke!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Da fehlen zum einen insgesamt 3 Semikolons, zum anderen musst Du der 
Struct in der Union auch einen Namen geben - hier z.B. "b".

Schreibe:
1
typedef union
2
{
3
  struct
4
  {
5
    uint8_t NLOAD   : 1;
6
    uint8_t FNLOAD  : 1;
7
    uint8_t VANLOAD : 1;
8
   } b;
9
   uint8_t status;
10
} reg02;
11
12
int main ()
13
{
14
    reg02   tmp;
15
    tmp.b.NLOAD = 1;
16
17
    return 0;
18
}

Und es geht. Warum dieser merkwürdige Cast statt direkt den Typ von tmp 
richtig anzugeben?

: Bearbeitet durch Moderator
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Weil ein typecast keinen lvalue erzeugt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg W. schrieb:
> Weil ein typecast keinen lvalue erzeugt.

Korrekt. Das kommt, wenn man es probiert:
1
error: lvalue required as left operand of assignment

von Holger K. (holgerkraehe)


Lesenswert?

Hab das problem gelöst. Danke!

von fop (Gast)


Lesenswert?

Also :
1
typedef union
2
{
3
  struct
4
  {
5
    uint8_t NLOAD   : 1;
6
    uint8_t FNLOAD  : 1;
7
    uint8_t VANLOAD : 1;
8
   } b;
9
   uint8_t status;
10
} reg02;
11
12
int main ()
13
{
14
   uint8_t tmp
15
   ((reg02*)&tmp)->b.NLOAD = 1;
16
17
    return 0;
18
}

Muhaha... da schüttelt's einen.

von Oliver S. (oliverso)


Lesenswert?

Fehlt nur noch die Erkärung des Sinns der ganzen Aktion. Also: Warum 
überhaupt eine Union mit lauter uint8_t ?

Oliver

von Peter II (Gast)


Lesenswert?

Oliver S. schrieb:
> Warum
> überhaupt eine Union mit lauter uint8_t ?

du übersiehst das ":1"

(ich würde es aber auch nicht so machen)

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.