if stack overflow

CHDK-Skripte, CHDK-Entwicklung, PC-Zusatzprogramme, Informationen für Tüftler

if stack overflow

Beitragvon Plenz » 07.03.2010, 19:10

Soeben hat sich mein Script beendet mit der Meldung "if stack overflow" (oder so ähnlich).
Ich verstehe diese Meldung so, dass das Script zu viele "if" ohne "endif" enthält. Was allerdings auf meinen Code nicht zutrifft.

Zwei mögliche Fehlerquellen:

1.) Einzeiliger Code
Code: Alles auswählen
if <Bedingung> then <Befehl>

Das ist zwar nicht dokumentiert, funktioniert aber offensichtlich und ist auch in anderen Scripts so zu finden

2.) Raussprung
Code: Alles auswählen
if <Bedingung> then
  goto "Marke"
endif

Ich programmiere ja nicht erst seit gestern und weiß, dass man nicht aus for-next-Schleifen rausspringt, aber if-endif sollte kein Problem sein, oder?

Jedenfalls hat mein Script maximal drei Ebenen:
Code: Alles auswählen
do
  if then
  else
    if then
    endif
  endif
until

was den Stack nicht im mindesten strapazieren sollte.
Benutzeravatar
Plenz
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 110
Bilder: 1
Registriert: 21.09.2008, 12:51
Kamera(s): SX230HS

Beitragvon msl » 07.03.2010, 21:30

Hallo,

eine genauere Angabe der Fehlermeldung wäre schon hilfreich. ;)

Lautet sie IF STACK EXHAUSTED? Wenn ja, war einfach der If-Stack voll. Der ist auf 4 begrenzt. Ein Blick in den Quellcode-Bereich uBasic zeigt die entsprechenden Definitionen. Als alter Hase in Sachen Programmierung wirst Du das ja sofort sehen.

Durch die GOTOs in Deinem Skript hast Du schnell die Stack-Tiefe erreicht. Das war schon immer ein Nachteil bei Sprachen wie BASIC.

Gruß msl
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Re: if stack overflow

Beitragvon gehtnix » 07.03.2010, 22:11

Plenz hat geschrieben:
Code: Alles auswählen
if <Bedingung> then
  goto "Marke"
endif

Ich programmiere ja nicht erst seit gestern und weiß, dass man nicht aus for-next-Schleifen rausspringt, aber if-endif sollte kein Problem sein, oder?
Ohne das andere zu kennen tippe ich darauf.

Da wirst Du nicht umhin können Deine Kenntnisse von "Gestern" zu aktivieren ;)

gruß gehtnix
Benutzeravatar
gehtnix
CHDK-Legende
CHDK-Legende
 
Beiträge: 2406
Bilder: 8
Registriert: 17.04.2008, 12:42
Wohnort: München
Kamera(s): A610 100e+f + IXUS990 IS

Beitragvon Plenz » 08.03.2010, 22:38

msl hat geschrieben:eine genauere Angabe der Fehlermeldung wäre schon hilfreich. ;)
Lautet sie IF STACK EXHAUSTED?
Hab's mir leider nicht aufgeschrieben, aber ich denke mal, OVERFLOW und EXHAUSTED kommt aufs selbe raus.

msl hat geschrieben:Wenn ja, war einfach der If-Stack voll. Der ist auf 4 begrenzt. Ein Blick in den Quellcode-Bereich uBasic zeigt die entsprechenden Definitionen. Als alter Hase in Sachen Programmierung wirst Du das ja sofort sehen.
Bin vielleicht ein alter Hase in allen möglichen Sprachen, aber nicht C.

msl hat geschrieben:Durch die GOTOs in Deinem Skript hast Du schnell die Stack-Tiefe erreicht. Das war schon immer ein Nachteil bei Sprachen wie BASIC.
Das würde ich nicht so pauschal sagen. Schleifen und Subroutinen erfordern einen Stack, um zum Ausgangspunkt zurückspringen zu können, aber bei IF...THEN würde ich das nicht vermuten, weil es da nur vorwärts geht. 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.

Jedenfalls wäre das wieder mal was fürs Handbuch:
- Verschachtelungsebenen für IF...THEN...ELSE...ENDIF in verschiedenen Zeilen
- Verschachtelungsebenen für IF...THEN in einer Zeile
Benutzeravatar
Plenz
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 110
Bilder: 1
Registriert: 21.09.2008, 12:51
Kamera(s): SX230HS

Re: if stack overflow

Beitragvon Plenz » 08.03.2010, 22:42

gehtnix hat geschrieben:Da wirst Du nicht umhin können Deine Kenntnisse von "Gestern" zu aktivieren ;)

Nein, im Gegenteil :)
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.
Benutzeravatar
Plenz
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 110
Bilder: 1
Registriert: 21.09.2008, 12:51
Kamera(s): SX230HS

Re: if stack overflow

Beitragvon gehtnix » 08.03.2010, 22:57

Plenz hat geschrieben:
Code: Alles auswählen
1234 IF A=1 THEN GOTO 6789
völlig legal und normal.
Da wurden ja noch die Lochkarten in Marmor gemeißelt. Soweit wollte ich dann doch nicht zurückgehen. :D

gruß gehtnix
Benutzeravatar
gehtnix
CHDK-Legende
CHDK-Legende
 
Beiträge: 2406
Bilder: 8
Registriert: 17.04.2008, 12:42
Wohnort: München
Kamera(s): A610 100e+f + IXUS990 IS

Re: if stack overflow

Beitragvon rudi » 09.03.2010, 09:55

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:
Syntax: [ Download ] [ Verstecken ]
Benutze uBasic Syntax Highlighting
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
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 510
Registriert: 11.09.2009, 11:27
Kamera(s): A590IS_101B, SX260_100B

Re: if stack overflow

Beitragvon Plenz » 09.03.2010, 10:15

rudi hat geschrieben: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.

Klar kommt man auch ohne GOTO aus, aber ich hatte es ganz bewusst mit dem Ziel eingesetzt, um Schleifenebenen einzusparen und damit Stackproblemen aus dem Weg zu gehen. Wobei der Schuss leider nach hinten losging :oops:

OK... wenn ich die Erklärung so richtig verstehe, dass der Stack nicht nur benötigt wird, um Sprungadressen zu verwalten, sondern auch um Ergebnisse vorzuhalten, dann ist das ein Thema, dem unbedingt ein wenig Platz im Handbuch eingeräumt werden sollte.
Benutzeravatar
Plenz
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 110
Bilder: 1
Registriert: 21.09.2008, 12:51
Kamera(s): SX230HS

Beitragvon msl » 09.03.2010, 12:20

msl hat geschrieben:Lautet sie IF STACK EXHAUSTED?
das war ein Fehler von mir. Wie rudi richtig schrieb, werden die Fehlermeldungen im Klartext ausgegeben, also "if: Stack ful".

Handbuch wurde mit den gewünschten Bemerkungen zum Stack-Verhalten ergänzt. Dazu kommen noch einige Fehlerkorrekturen zum Thema Verzweigung nach einem Hinweis von rudi.

Gruß msl
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a


Zurück zu Code-Ecke

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 19 Gäste