ich hätte da eine Frage zum Verhalten einer while Schleife
while ( PHASE++ <= 2048 )
{
// something is done here
Serial.println(PHASE);
}
Die Variable PHASE ist ausserhalb der Loop als int Variable deklariert und als Anfangswert wurde ihr 1 zugewiesen !
Seltsamerweise stoppt die Schleife aber nicht bei 2048 !... sondern läuft weiter wobei der Wert der Variablen nach 2049 auf - 32767 ( Bild anbei ) springt und weiter in Richtung 0 läuft obwohl ja überhaupt nur bis 2048 erwünscht ist.
Was du siehst ist ein ganz normales Verhalten.
Du interpretierst das Ergebnis vermutlich falsch.
solange die PHASE <= 2048 ist wird der Schleifenrumpf ausgeführt.
Zunächst der Postincrement - daher gehts bis 2049.
von 2049 bis 32767 erfolgt keine Ausgabe da die Bedingung nicht erfüllt ist.
--> Der Increment wird mit jeder Prüfung/bei jedem Loop Durchlauf durchgeführt.
Jeder Durchlauf erhöht um 1, es kommt zum überlauf und wird zu - 32768
Daher ist die Bedingung wieder true, und mit dem Postincrement wird daraus -32767 was auch ausgegeben wird.
Also alles ganz normal.
P.S.: ob Postincrement oder Preincrement hat wenig Einfluss, es geht darum dass der Increment in der Bedingung ist und nicht im Schleifenkörper.
Ja natürlich macht es einen Unterschied ob gleich der um eins erhöhte Wert ...also ( ++PHASE ) übergeben und in der Bedingung geprüft wird oder nicht....aber das ist ja nicht das eigentliche Problem !
Was du siehst ist ein ganz normales Verhalten.
Du interpretierst das Ergebnis vermutlich falsch.
solange die PHASE <= 2048 ist wird der Schleifenrumpf ausgeführt.
Zunächst der Postincrement - daher gehts bis 2049.
von 2049 bis 32767 erfolgt keine Ausgabe da die Bedingung nicht erfüllt ist.
Hallo noiasca !
Da kommt es eben doch zur Ausgabe ! ( siehe Bild vom Serial Monitor) aber eben gleich springend auf - 32767 !
Ein Überlauf wäre mir klar, wenn bis über den positiven int Bereich gezählt würde, aber das ist ja nicht der Fall.
Ein Überlauf von vorzeichenbehafteten Zahlen ist in C++ bewusst nicht definiert und führt darum in ein undefiniertes Verhalten.
Klartext: Dein Programm ist total kaputt!
Nein!
Die anderen Loop() Durchläufe siehst du nur nicht.
Doch!
Wenn ich dir glauben würde, müsste ich auch, so wie du, annehmen dass der Compiler an der Stelle kaputt ist.
Ist er aber nicht, es ist deine Denke, die nicht so funktioniert, wie der µC bzw. der Compiler.
ich habe mich hier auf ein Beispiel aus dem Buch von Danny Schreiter bezogen wo er das mit den Schleifen erklärt....
Auszug davon:
In den runden Klammern hinter der while-Anweisung steht nun
nur noch die Bedingung. Der Inkrementaloperator erspart uns
in diesem Beispiel einen separaten Befehl zur Erhöhung des Zählers. Dieser müsste ansonsten innerhalb des Schleifenrumpfs
erfolgen.
Das ließe doch darauf schließen, dass beide Varianten gleiches Verhalten zeigen müssten ?!?
Ja... jetzt hab ich es gesehen...hab mir die Variable nach der Schleife ausgegeben und bingo..... sie läuft weiter ! eigentlich eh klar .... ist ja mit PHASE++ in der Bedingung nicht bedingt, dass sie nicht erhöht wird !
Erhöht wird sie ja nur nicht wenn PHASE++ im Schleifenrumpf steht