Schleife bis 0

Moin,

ich steht grad auf dem Schlauch.
Ich möchte eine Schleife rückwarts bis 0 laufen lassen.

Hier läuft die Schleife von 0-359 (interessanterweise fängt die schleife nicht bei 0 an, wenn ich das delay weglasse. Da scheint es wohl etwas zu dauern bis der serielle Monitor gestartet ist)
Abbruchbedingung: rev < 360

int rev;
void setup() {
  Serial.begin(74880);
  delay(100);
  for (rev = 0; rev < 360; rev++) {
    Serial.println(rev);
  }
}
void loop() {
}

Nun andersrum:
Abbruchbedingung: rev > 0

int rev;
void setup() {
  Serial.begin(74880);
  delay(100);
  for (rev = 359; rev > 0; rev--) {
    Serial.println(rev);
  }
}
void loop() {
}

Jetzt läuft die Schleife von 359-1.
Ich möchte aber bis 0
So geht es:
Abbruchbedingung: rev > -1

int rev;
void setup() {
  Serial.begin(74880);
  delay(100);
  for (rev = 359; rev > -1; rev--) {
    Serial.println(rev);
  }
}
void loop() {
}

Aber warum geht es denn nicht mit:
Abbruchbedingung: rev == 0

int rev;
void setup() {
  Serial.begin(74880);
  delay(100);
  for (rev = 359; rev == 0; rev--) {
    Serial.println(rev);
  }
}
void loop() {
}

oder
Abbruchbedingung: rev = 0 (das geht wohl nicht weil es eine Zuweisung ist?!)

int rev;
void setup() {
  Serial.begin(74880);
  delay(100);
  for (rev = 359; rev = 0; rev--) {
    Serial.println(rev);
  }
}
void loop() {
}

Danke und lieben Gruß,
Chris

for (int rev=359; rev >= 0; rev--)

Nicht technisch erklärt:

"Führe durch solange rev == 0 ist"

Daher klappt das nicht.

du könntest aber auch so abfragen:

rev >= 0

edit: zu spät

Hallo,

rev == 0 kann nicht funktionieren.

Der Ausdruck muss zum ausführen gültig sein. Wenn er nicht mehr gültig ist bricht die for Schleife ab. Du initialisierst rev mit 359 und prüfst ob rev == 0 ist. Ergebnis ist ungültig deswegen keine Schleifenausführung.

da rev eigentlich vorzeichenlos ist (?), könnte man es auch so realisieren.

unsigned rev=360;
while (rev != 0) Serial.println(--rev);

Moin,

ja alles klaro, da hab ich gar nicht rüber nachgedacht → falsch gedacht.
Danke für die Erleuchtung!

Lieben Gruß,
Chris

Im Prinzip ist das also eine negierte Abruchbedingung. Nicht bis rev = 0 ist, sondern solange wie rev größer oder gleich 0 ist. Okay, verstanden.

Nun habe ich folgendes getestet:

int rev;
void setup() {
  Serial.begin(74880);
  delay(100);
  for (rev = 359; rev >= 0; rev--) {
    Serial.println(rev);
  }
Serial.println(rev);
}
void loop() {
}

Innerhalb der Schleife ist rev noch 0. Das vestehe ich. Außerhalb der Schleife am Ende ist rev plötzlich -1. Wieso denn das?!

Leben Gruß, Chris

Hallo,

Stichwort Gültigkeitsbereich der Variable.

re-- wird ja nochmal ausgeführt, sonst könnte die Prüfung >=0 nicht stattfinden. Nach der for Schleife lässt du dir den Wert nach der letzten Änderung ausgegeben, die ist nun einmal -1 in dem Fall.

for Schleifen Körper Variablen sollte man niemals außerhalb deklarieren. Außer man hat sehr gute Gründe dafür.

Okay, das heißt außerhalb der Schleife ist es egal, da ich den Wert ja nur innerhalb der Schleife benutze. Verstanden.

Meine Idee war, dass ich die Schleife ablaufen lasse und nur am Ende ein Serial.Print nehme um das Endresultat anzuschauen.

Das geht dann so nicht.

Lieben Gruß, Chris

Hallo,

ich würde es so machen, dann kommt man erst gar nicht in Versuchung die for Schleife fälschlicherweise zu manipulieren.

int last;

void setup() {
  Serial.begin(74880);
  delay(100);
  
  for (int rev = 359; rev >= 0; rev--) {
    last = rev;
    //Serial.println(rev);
  }
  Serial.println(last);
}

void loop() {
}