Forum: Mikrocontroller und Digitale Elektronik C: Adresse von Strukturelement


von Gerald (Gast)


Lesenswert?

Hallo,

ich habe eine Funktion geschrieben, die den Wert im RAM und EEPROM 
vergleicht und bei Änderungen im RAM automatisch den Wert im EEPROM 
aktualisiert.

Die Parameter habe ich in einer Struktur definiert, die unter anderem 
auch die Adresse der entsprechenden RAM-Speicherstelle beinhaltet. Ich 
habe nun das Problem, daß ich auch Parameter habe, die ein Arrayelement 
sind. Hier kommt dann folgende Warnung vom Compiler:

initialization discards 'volatile' qualifier from pointer target type 
[-Wdiscarded-qualifiers]
1
&slave_allgemein.uiSendeintervall_fsp_status   // keine Warnung vom Compiler
2
&slave[0].uiLaufzeit_max    // Warnung vom Compiler

Wie muß ich die Adresse des Arrayelements beim Definieren angeben?

Gerald

von Einer K. (Gast)


Lesenswert?

Erstens:
Die Meldung ist glaubwürdig!

Zweitens:
Der Code ist bis zur Unkenntlichkeit verstümmelt.

von g457 (Gast)


Lesenswert?

> Wie muß ich die Adresse des Arrayelements beim Definieren angeben?

Code zeigen, sonst kann man nur raten.

von Theor (Gast)


Lesenswert?

Der Code wird ein wenig helfen, denke ich.

Die Warnung sagt, dass eine volatile Variable zur Initialisierung einer 
anderen Variablen benutzt wird, die nicht volatile ist.

Die langfristig wichtige Information ist, dass die Ursache von Warnungen 
dieser Art "Initialisierung" und "Qualifizierer" in der Regel in den 
Deklarationen zu finden ist.

In dem Codeschipsel ist das nicht zu sehen, da er keine Variablen- bzw. 
Parameterdeklarationen enthält.

von Gerald (Gast)


Lesenswert?

Danke für den Tipp. Die betreffenden Variablen waren mit volotile 
deklariert:
"volatile unsigned int uiLaufzeit_max;"

Ohne volotile kommt die Warnung nicht. Hat sich somit erledigt.

Grüße
Gerald

von Theor (Gast)


Lesenswert?

Gerald schrieb:
> Danke für den Tipp. Die betreffenden Variablen waren mit volotile
> deklariert:
> "volatile unsigned int uiLaufzeit_max;"
>
> Ohne volatile kommt die Warnung nicht. Hat sich somit erledigt.
>

Du hast zwar nicht danach gefragt, aber ich nehme mir die Freiheit Dir 
zu raten, bei jeder Entfernung von volatile zu überlegen ob und warum an 
der Stelle ein volatile nötig ist oder nicht.

Ich meine, es wird (oder sollte) einen Grund gegeben haben, warum in dem 
Code volatile verwendet wurde.

von Gerald (Gast)


Lesenswert?

Theor schrieb:
> Ich meine, es wird (oder sollte) einen Grund gegeben haben, warum in dem
> Code volatile verwendet wurde.

Das mit dem volotile ist historisch bedingt. Da hat was nicht geklappt, 
da habe ich die Variablen als volotile deklariert. War aber damals nicht 
der Grund. Hab es dann damals vergessen rückgängig zu machen.

von Joule Sparer (Gast)


Lesenswert?

Gerald schrieb:
> da habe ich die Variablen als volotile deklariert

Muss es nicht "vollerteil" heissen?

von Rolf M. (rmagnus)


Lesenswert?

Theor schrieb:
> Die Warnung sagt, dass eine volatile Variable zur Initialisierung einer
> anderen Variablen benutzt wird, die nicht volatile ist.

Genauer gesagt wird die Adresse einer volatile-Variablen verwendet, um 
damit einen Zeiger auf nicht-volatile zu initialisieren. Da dadurch 
beim Zugriff über den Zeiger die volatile-Eigenschaft verloren geht, 
lässt der Compiler das ohne Cast nicht zu.

von Theor (Gast)


Lesenswert?

Rolf M. schrieb:
> Theor schrieb:
>> [...]
>
> Genauer gesagt wird die Adresse einer volatile-Variablen verwendet, um
> damit einen Zeiger auf nicht-volatile zu initialisieren. Da dadurch
> beim Zugriff über den Zeiger die volatile-Eigenschaft verloren geht,
> lässt der Compiler das ohne Cast nicht zu.

Stimmt. So ist das richtiger ausgedrückt. ... falls es da Grade gibt. 
:-)

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.