C: Adresse von Strukturelement

Gast #6535078
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
Gast #6535094
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.
Gast #6535103
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
Gast #6535130
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.
Gast #6535871
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.
#6536062
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.
Gast #6536086
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. 
:-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren