Forum: Mikrocontroller und Digitale Elektronik C Union ansprechen


von Klausy (Gast)


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?

von Stefan E. (sternst)


Lesenswert?

Klausy wrote:

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

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

von Klausy (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

Vielleicht DMA.TEMP.L ?

von Klausy (Gast)


Lesenswert?

auch nicht!

von Stefan E. (sternst)


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.

von Klausy (Gast)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

Klausy wrote:
> Arbeite mit Codevisoin AVR

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

von Klausy (Gast)


Lesenswert?

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

von Stefan E. (sternst)


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.

von Klausy (Gast)


Lesenswert?

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

von Michael Wilhelm (Gast)


Lesenswert?

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

MW

von Stefan E. (sternst)


Lesenswert?

> Poste doch mal die komplette Definition von DMA_t.

von yalu (Gast)


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.

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.