www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C Union ansprechen


Autor: Klausy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin, hab da ein verständnisproblem mit dem Ansprechen einer Union.

Im Header ist definiert:

#define WORDREG(register_name) union\
        {\
        unsigned int register_name;\
        struct\
             {\
             unsigned char register_name ## L;\
             unsigned char register_name ## H;\
             };\
        }



und des weiteren:

typedef struct DMA_struct
             {
             unsigned char CTRL; // Control
             ...
             WORDREG(TEMP); // Temporary Reg. For 16/24-bit Access
             ...

             } DMA_t;

So, in meinem source code kann kann ich CTRL einfach mit:
DMA.CTRL = 0x80; ansprechen.(kein Problem).
Wie spreche ich jetzt aber DMA.TEMP (H oder L) an?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klausy wrote:

> Wie spreche ich jetzt aber DMA.TEMP (H oder L) an?

DMA.TEMP = 0xabba;
DMA.TEMPL = 42;
DMA.TEMPH = 69;

Autor: Klausy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eben nicht! Der Compiler sagt dann: undefined member TEMP, bzw. TEMPL

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht DMA.TEMP.L ?

Autor: Klausy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auch nicht!

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klausy wrote:
> eben nicht!

Doch, genau so.
Vorsichtshalber schnell mal mit dem GCC testen ... ja, funktioniert.

> Der Compiler sagt dann: undefined member TEMP, bzw. TEMPL

Dann liegt da irgendetwas anderes im Argen, z.B. Tippfehler.

Autor: Klausy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arbeite mit Codevisoin AVR (da kommt auch der Header her)
bei mir funktionierts nicht!

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klausy wrote:
> Arbeite mit Codevisoin AVR

Zu dem Compiler kann ich nichts sagen. Vielleicht hat er ja irgendwelche 
Probleme mit anonymen Unions.

Autor: Klausy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann wärs doch nicht so in den beiligenden Headern definiert..

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann werfe mal einen verschärften Blick in die Sourcen.
Steht da wirklich "WORDREG(TEMP);", und nicht "WORDREG(TMP);", oder 
"WORDREG(temp);", oder ...
Oder steht es vielleicht in einer weiteren struct innerhalb von 
DMA_struct?
Poste doch mal die komplette Definition von DMA_t.

Autor: Klausy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eben nicht alles mit copy and paste gemacht und 100mal geprüft.

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gehts so evtl:
DMA_t.TEMP = 0xabba;
DMA_t.TEMPL = 42;
DMA_t.TEMPH = 69;

MW

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Poste doch mal die komplette Definition von DMA_t.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unbenannte Structs und Unions scheinen nicht Standard zu sein. Übergibt
man dem GCC die Option -std=c89 oder -std=c99, meckert er ebenfalls,
dass DMA_t keine Member mit den Namen TEMP, TEMPL und TEMPH enthält.

Vielleicht muss man beim Codevision im Gegensatz zum GCC diese
Erweiterungen explizit aktivieren.

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.
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.