Forum: Mikrocontroller und Digitale Elektronik C: Adresse von Strukturelement


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 Gerald (Gast)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
Erstens:
Die Meldung ist glaubwürdig!

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

von g457 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Wie muß ich die Adresse des Arrayelements beim Definieren angeben?

Code zeigen, sonst kann man nur raten.

von Theor (Gast)


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


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


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


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


Bewertung
0 lesenswert
nicht lesenswert
Gerald schrieb:
> da habe ich die Variablen als volotile deklariert

Muss es nicht "vollerteil" heissen?

von Rolf M. (rmagnus)


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


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

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.

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