(deleted)
erster google link brachte mich zu:
You are changing trackTail[nodeNumber-1] twice between sequence points: once through ++, and once through assignment.
auf c - Operation on ... may be undefined? - Stack Overflow
umgehung, ungeprüft:
zaehler = (zaehler+1)%5;
(deleted)
Peter-CAD-HST:
Moin noiasca
Danke für deine konstruktive Antwort.
Mit dieser Änderung wird das Programm ohne Warnmeldugen übersetzt.
Gruss Peter
und gesund bleiben
Na aller Achtung!
Vor nicht allzu langer Zeit.
Programmteil per Taster Einschalten #12 Aug 03, 2020, 11:05 am
Besser du schreibst dir das mal auf.
Programmteil per Taster Einschalten #14 Aug 03, 2020, 01:00 pm
++zaehler = zaehler % 5;
Gruß Fips
++zaehler = zaehler % 5;
sketch_sep21a.ino:13:3: warning: operation on 'zaehler' may be undefined [-Wsequence-point]
++zaehler = zaehler % 5;
^~~~~~~~~
Nicht jede Kompilerversion erkennt jedes Sequence Point Problem.
Manche kann er gar nicht erkennen.
Die Sequence Point Problematik ist in der C++ Spezifikation festgeschrieben.
(den Bereich muss man nur mal lesen)
Also ist der Programmierer dafür verantwortlich die Sequence Points richtig zu setzen
Hier ist die eine richtige Variante:
++zaehler;
zaehler %= 5;
Alternativ:
++zaehler, zaehler %= 5;
So kann nichts anbrennen.
Ich habe damit gerechnet, das du dich auf #3 hin zu Wort meldest.
combie:
Hier ist die eine richtige Variante:++zaehler;
zaehler %= 5;
Diese Version ist mir bekannt.
combie:
sketch_sep21a.ino:13:3: warning: operation on 'zaehler' may be undefined [-Wsequence-point]
++zaehler = zaehler % 5;
^~~~~~~~~
Nicht jede Kompilerversion erkennt jedes Sequence Point Problem. Manche kann er gar nicht erkennen. Die Sequence Point Problematik ist in der C++ Spezifikation festgeschrieben. [(den Bereich muss man nur mal lesen)](https://en.cppreference.com/w/cpp/language/eval_order) Also ist der Programmierer dafür verantwortlich die Sequence Points richtig zu setzen
Mit dem Esp8266 und der IDE bekomme ich keine Warnung angezeigt.
++indexHour = indexHour % (sizeof fifoHour / sizeof fifoHour[0]);
++indexDay = indexDay % (sizeof fifoDay / sizeof fifoDay[0]);
Läuft seit Monaten bei mir, ohne Sorgen.
Aber gut, werde mir dein verlinktes mal zu Gemüte führen.
Mal sehn ob es bei mir im Oberstübchen ankommt!
Gruß Fips
Leider sind die Regeln seit C++11 viel, viel komplizierter formuliert als vorher, da sie allgemeiner gehalten sind und Multithreading berücksichtigen.
Man sollte grundsätzlich so schreiben, dass es möglichst verständlich und eindeutig ist.
Übrigens:
zaehler = (zaehler >= 4)? 0:zaehler+1; // Ohne Modulo-Division spart das 28 Byte Flash bei meinem atmega328
Hallo,
die Einfachste merkbare Regel lautet, auf der linken Seite wird einfach nicht gerechnet sondern nur zugewiesen. Die Addition kann man auch rechts machen. Oder in einer Zeile davor oder danach, je nachdem was man wie rechnen möchte.
Die Kurzschreibweisen kann man sich im Grunde gleich abgewöhnen wenn man mit >= C++ 20 handiert. Sonst muss man im Syntax zusätzlich für volatile und nicht volatile Variablen unterscheiden. Ansonsten erscheinen die nächsten Warnungen. Da wurde vieles gestrafft.
Läuft seit Monaten bei mir, ohne Sorgen.
Da kann ich nichts gegen sagen.
Wird wohl so sein .....
Könnte/wird aber so sein dass es auf einem anderen Prozessor nicht läuft.
Selbst mit einer anderen Compilerversion, kann es dann schon krachen.
Oder nur die Optimierungsstufe, bei gleichem Compiler.
++indexHour = indexHour % (sizeof fifoHour / sizeof fifoHour[0]);
Das erzeugt undefiniertes Verhalten, laut Doku.
Ist also die C++ Variante von "Russisch Roulette" und das ist völlig unabhängig davon, ob der Compiler das meldet, oder nicht.
- Between the previous and next sequence point a scalar object must have its stored value modified at most once by the evaluation of an expression, otherwise the behavior is undefined.
OK!
- There is a sequence point at the end of each full expression (typically, at the semicolon).
Das der Kommaoperator auch ein Sequenzpunkt ist habe ich dann anderweitig gefunden.
Serenifly:
Leider sind die Regeln seit C++11 viel, viel komplizierter formuliert als vorher, da sie allgemeiner gehalten sind und Multithreading berücksichtigen.
Sowas durchzuackern.......
Kompliziert ist noch geschönt.
michael_x:
Man sollte grundsätzlich so schreiben, dass es möglichst verständlich und eindeutig ist.Übrigens:
zaehler = (zaehler >= 4)? 0:zaehler+1; // Ohne Modulo-Division spart das 28 Byte Flash bei meinem atmega328
zaehler >= 4 ? zaehler = 0 : zaehler + 1;
Spart noch mehr, jedenfalls auf einem Esp8266.
combie:
Das erzeugt undefiniertes Verhalten, laut Doku.
Ist also die C++ Variante von "Russisch Roulette" und das ist völlig unabhängig davon, ob der Compiler das meldet, oder nicht.
Ich glaube dir doch, sowieso!!
Gruß Fips