Hallo Plenz,
Plenz hat geschrieben:Meldung "if stack overflow" (oder so ähnlich)
Wie msl schon schrieb:
ubasic.c ab Zeile 120 da sind alle Fehlermeldungen im Klartext hinterlegt.
Plenz hat geschrieben:Jedenfalls hat mein Script maximal drei Ebenen:
do
if then
else
if then
endif
endif
until Erstellt in 0.004 Sekunden, mit
GeSHi 1.0.8.9
was den Stack nicht im mindesten strapazieren sollte.
Dieses Script belastet den IF-Stack nur mit 2 Einträgen, da jede Schleifenfunktion seinen eigenen Stack besitzt um Zuordnungsfehler zu vermeiden.
Plenz hat geschrieben:Da wird eigentlich nur ein Zähler gebraucht: Wenn die Bedingung unwahr ist, suche das nächste ENDIF und überspringe dabei so viele weitere ENDIFs wie du IFs findest.
Das uBasic der Kamera arbeitet nicht alle Zeilen direkt hintereinander ab. Es wird aller 10ms eine Zeile ausgeführt (manche Befehle schummeln ein wenig z.B. SELECT führt das erste CASE direkt mit aus). Um also bei einem mehrzeiligen IF für das ELSE noch das Vergleichsergebnis zu haben, wird dieses auf dem IF-Stack abgelegt und das ENDIF bereinigt diesen wieder. Schickt ein GOTO den Zeilenzähler am ENDIF "vorbei", verbleibt der Wert auf dem Stack.
Plenz hat geschrieben:Damals in der Computer-Steinzeit herrschte noch das Zeilennummern-BASIC vor, und da waren Zeilen wie
- Code: Alles auswählen
1234 IF A=1 THEN GOTO 6789
völlig legal und normal.
Auch heute noch ist dieser Einzeiler, wenn er alleine steht, voll funktionstüchtig (ohne führende Zeilennummer und mit Label statt Zielzeilennummer). Dabei wird auch kein Stackeintrag angelegt.
Zwei Links zum Thema Stack, IF, GOTO:
hier und
da
Meiner Erfahrung nach sind alle Programmieraufgaben ohne GOTO lösbar - es ist nur manchmal sehr einfach mit. Viele Programmiersprachen besitzen aus diesem Grund kein GOTO - unter anderem auch LUA.
Gruß rudi