Forum: Mikrocontroller und Digitale Elektronik Variable zu union casten


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.
von Holger K. (holgerkraehe)


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


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


Bewertung
0 lesenswert
nicht lesenswert
Weil ein typecast keinen lvalue erzeugt.

von Frank M. (ukw) (Moderator) Benutzerseite


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


Bewertung
0 lesenswert
nicht lesenswert
Hab das problem gelöst. Danke!

von fop (Gast)


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


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


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

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]
  • [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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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