Endlosschleifen
Wenn die Bedingung einer while-Schleife nie falsch wird, endet die Schleife nie. Das nennt man eine Endlosschleife, und sie ist einer der häufigsten Fehler bei Schleifen. Hier fehlt die Zeile tag = tag + 1:
local tag = 1
while tag <= 3 do
print("Tag " .. tag)
endtag bleibt 1, die Bedingung tag <= 3 ist immer wahr, und das Programm gibt immer wieder Tag 1 aus:
Tag 1
Tag 1
Tag 1
Tag 1
...Auf deinem eigenen Computer würde ein solches Programm laufen, bis du es anhältst. Auf dieser Seite wird es nach 5 Sekunden gestoppt, und du siehst die Meldung Das Programm lief zu lange und wurde angehalten. Enthält es eine Schleife, die nie endet? Was das Programm bis dahin ausgegeben hat, bleibt in der Ausgabe stehen, sodass du siehst, wo es hängen geblieben ist. (Eine sehr lange Ausgabe wird nach etwa 100.000 Zeichen abgeschnitten und endet mit ….) Wenn die Schleife nichts ausgibt, siehst du nur die Meldung.
Wenn du sie siehst, prüfe jede Schleife: Verändert etwas in ihrem Block die Variable in der Bedingung, sodass die Bedingung irgendwann falsch wird? Typische Ursachen:
- Nichts verändert die Variable, wie im Beispiel oben.
- Die Variable ändert sich in die falsche Richtung. Bei einem Countdown
while samen > 0 domachtsamen = samen + 1stattsamen = samen - 1den Wert vonsamenimmer größer, und die Bedingung bleibt wahr. - Die Änderung steht nach dem
end. Nur der Code zwischendoundendwird wiederholt. Eine Zeile unter demendwürde nach der Schleife laufen, und die kommt nie. Wenn du den Block einrückst, siehst du, was drinsteht. - Ein Tippfehler links vom
=.saamen = samen - 1verändertsamennicht. Lua meldet keinen Fehler: Es erzeugt stillschweigend eine neue globale Variablesaamen, undsamenbleibt für immer gleich. - Die Bedingung verfehlt ihr Ziel. Eine Bedingung mit
~=(ungleich) ist für jede Zahl wahr außer einer. Wenn die Variable über diese eine Zahl hinwegspringt, läuft die Schleife ewig weiter. Deshalb benutzen zählende Schleifen meistens<,<=,>oder>=: Sie enden auch dann, wenn die Variable über die Grenze hinausspringt.
Das Programm im Editor hat eine Schleife mit ~=. Im Moment funktioniert sie, weil beet um 1 wächst und genau auf 10 trifft. Sehen wir, was passiert, wenn es um 2 wächst.
So schreibst du es:
Anweisungen
- 1
Gestern hat es auf den Beeten mit geraden Nummern geregnet, deshalb gießt Emma heute nur die ungeraden: 1, 3, 5, 7 und 9. Ändere die Zeile
beet = beet + 1so, dassbeetum 2 wächst, und führe das Programm aus. Es endet nicht von selbst und wird nach 5 Sekunden gestoppt. Sieh dir die Ausgabe an: Welche Zahlen durchläuftbeet, und warum wird die Bedingung nie falsch? Behebe dann die Bedingung, sodass das Programm Folgendes ausgibt:Beet 1 wird gegossen Beet 3 wird gegossen Beet 5 wird gegossen Beet 7 wird gegossen Beet 9 wird gegossen Fertig - 2
In 3 Tagen ist Markttag. Erzeuge unter dem Programm eine lokale Variable
tage_bis_marktmit dem Wert3und schreibe einewhile-Schleife, die läuft, solangetage_bis_marktgrößer als0ist. Gib darinTage bis zum Markt:und den Wert vontage_bis_marktaus und verringere ihn dann um 1. (Wenn du stattdessen 1 addierst, endet die Schleife nie.) Gib nach der SchleifeMarkttag!aus. Das Ende der Ausgabe ist:Tage bis zum Markt: 3 Tage bis zum Markt: 2 Tage bis zum Markt: 1 Markttag!