volatile in Funktion

Hallo Leute,
ich bastle grad an ner Heizungsüberwachung und hab da eine Funktion drin die die vorige Temperatur prevTemp mit der momentanen Temperatur vergleicht und bei einer Änderung einen grünen oder roten Pfeil an den Bildschirm klatscht und da würde sich "volatile prevTemp" doch anbieten .

it directs the compiler to load the variable from RAM and not from a storage register

Laut Arduino Referenz ist volatile nur für interrupts. Ist es sinnvoll volatile auch für normale funktionen zu nutzen oder soll man das lassen?

void drawTemp(int _oben, int _mitte, int _unten, long _unix ) {
  volatile int prevTempOben;

  drawArrow(_oben, prevTempOben);
  tft.setCursor(50, pY + 10);
  tft.println(_oben);

  prevTempOben= _oben;
  ......

Ich würde mich über eure Meinung freuen
Danke

Schaden wird es nichts. Aber es ist überflüssig

Den Parameter in eine extra Variable zu kopieren scheint auch überflüssig

volatile sagt für den Compiler, dass sich der Wert der Variable unabhängig vom Programm ändern kann. Das kann entweder von einem einem anderen Prozess aus geschehe oder durch einen Interrupt - mehr Möglichkeiten gibt's hier nicht. Aber wenn nichts anderes den Wert der Variable ändern kann, dann ist volatile nicht förderlich.

Der Wert von prevTempOben muss ja erhalten bleiben. Es gibt ja keine andere möglichkeit variablen in Funktionen zu definieren ohne sie bei jedem Durchlauf wieder zu überschreiben,wie ich es also verstehe, ist es besser "int prevTempOben" global zu definieren.

Ich dachte mir einfach, es ist schöner wenn alle deklarationen in der Funktion beieinander stehen.

Wie aber Serenifly sagt,schaden wird es nicht also probier ich mal rum...

Vielen Dank euch beiden

Ich würde mich über eure Meinung freuen

Progammieren ist nicht in allen Punkten demokratisch.

z.B. hier zählt keine Meinung.
Es ist einfach nur unsinnig.
Vermutlich solltest du die Bedeutung von volatile nochmal nachlesen.
Ich kann nur vermuten, dass du stattdessen eine lokale statische Variable verwenden wolltest.

Aber selbst dann, gibt es vermutlich "schönere" Möglichkeiten.

PS:
3 * vermuten, ist mir ja noch nie passiert :slight_smile:

Hi

volatile wird hier eher den Nachteil haben, daß der Wert IMMER aus dem Speicher ausgelesen wird - Das dauert länger.
i=0;
i++;
i++;

  1. zugewiesen (ab in den Speicher damit) und 2x aus dem Speicher ausgelesen, statt aus dem Register, wo der Wert eh schon drin steht.

MfG

Andonoc:
Es gibt ja keine andere möglichkeit variablen in Funktionen zu definieren ohne sie bei jedem Durchlauf wieder zu überschreiben

1.) Man kann lokale Variablen als static deklarieren. Dann behalten sie ihren Wert
2.) Man kann Variablen als Referenz übergeben damit Änderungen außerhalb sichtbar sind

Wenn dass dein Problem ist sehe ich aber nicht wie du da auf volatile gekommen bist. Das ist etwas völlig anderes

Eventuell einfach mal übersetzen : Volatile heißt flüchtig.

Es sagt dem Compiler das die Variable sich ändern obwohl er das nicht sieht.
Solche Variablen, wo der Compiler nicht sehen kann das sie sich ändern (z.b. im Interrupt)
würde er ohne das Keyword volatile komplett wegoptimieren und dann wundert man sich warum
der Code nicht läuft.

Ulli

Da hab ich etwas irgendwie falsch interpretiert. Danke für eure erklärungen!!!
Und danke fürs static, ganau das habe ich gesucht.

2.) Man kann Variablen als Referenz übergeben damit Änderungen außerhalb sichtbar sind

meinst du da als pointer?

Dankeschön euch allen

Andonoc:
meinst du da als pointer?

Nein. Referenzen haben ein paar Ähnlichkeiten zu Zeigern, aber sie ein eigenständiges Konstrukt:

Danke nochmal Serenifly, ich glaube das wärs richtige, da setz ich mich morgen ran!
gute Nacht noch