[uBasic] "Nested if" Bug

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

Beitragvon msl » 13.09.2009, 12:04

SDM -> Stereo-Data-Maker

Danke für Eure gute Analyse der endif-Problematik. Die Beiträge von rudi und BigDaddy bringen uns beim Skripten ein Stück weiter.

Moderator-Anmerkung: Man kann auch mal die Edit-Funktion verwenden, statt Mehrfachpostings. ;)

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

Beitragvon gehtnix » 13.09.2009, 12:09

Hi,

puh :shock: , Du gräbst ja längst vergessene Sachen wieder aus.

SDM=StereoDataMaker spezielle CHDK-Version

Wenn Du auch schon "Autsch" getippt hast, mit rem, guckst Du in mein Md-Six.bas. Zeile 103 da steht "rem --- Leerzeile nicht löschen - sonst Fehler!". Gehört aber wohl eher zum IF-Thema.

Damit Dir nicht langweilig wird hier noch ein paar alte Beiträge zu uBasic-Themen:
viewtopic.php?t=515
viewtopic.php?t=529
forum/viewtopic.php?t=561
forum/viewtopic.php?t=562

[EDIT]
Das geht ja hier wie´s Brezlbacken, da kommt man ja kaum nach
Fred 529, da steht fast alles drinnen wie ich jetzt nochmals nachgelesen habe.
Den rem-Fall hatten wir dort schon mal mit print geschildert.
Das if in Klammern setzten löst auch Probleme!
[/EDIT]

es bleibt spannend

geschmeidig bleiben

gruß gehtnix
Bild
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 + IXUS50 101b

Beitragvon rudi » 15.09.2009, 20:37

Hallo Sripter,
ich habe mir jetzt eine Compiler- und Debug-Umgebung zusammengebaut.
Bei meinen ersten Versuchen mit dem Quelltext der IF-Anweisung habe ich auch ein Hinweis auf gehtnix sein Klammerproblem gefunden, wenn ich das Problem richtig verstanden habe. Einfach ansehen und wirken lassen.
Code: Alles auswählen
Vorgaben:
A=20
B=5
--------------------------
Vergleichsausdruck 1:
if A-B<6 then

Debugausgabe 1:
term: 5 < 6
term: =1 (true)
expr: 20 - 1
expr: =19 (true)
if_statement: relation 19
if_statement: result true
--------------------------
Vergleichsausdruck 2:
if (A-B)<6 then

Debugausgabe 2:
expr: 20 - 5
expr: =15
term: 15 < 6
term: =0 (false)
if_statement: relation 0
if_statement: result false
--------------------------
Vergleichsausdruck 3:
if 6>A-B then

Debugausgabe 3:
term: 6 > 20
term: 0 (false)
expr: 0 - 5
expr: =-5 (true)
if_statement: relation -5
if_statement: result true
--------------------------
Vergleichsausdruck 4:
if 6>(A-B) then

Debugausgabe 4:
expr: 20 -5
expr: =15
term: 6 >15
term: =0 (false)
if_statement: relation 0
if_statement: result false

Jetzt habe ich mal angefangen die IF-Anweisung in der ubasic.c neu zu schreiben. Ziel ist es die ursprüngliche (einzeilig und ohne ENDIF) sowie die mehrzeilige Version neu umzusetzten. Ich habe bis jetzt nicht einmal Fehler erhalten wenn die einzeilige Version innerhalb der mehrzeiligen steht. Ich hänge mal die Ausgaben der beiden Beanstandungen von BigDaddy (siehe weiter oben) mit an, sowie den aktuellen diff.

Gruß Rudi
Dateianhänge
BigDaddy_2.txt
(560 Bytes) 127-mal heruntergeladen
BigDaddy_1.txt
(226 Bytes) 118-mal heruntergeladen
Zuletzt geändert von rudi am 17.09.2009, 06:47, insgesamt 2-mal geändert.
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 509
Registriert: 11.09.2009, 11:27
Kamera(s): A590IS_101B, SX260_100B

Beitragvon gehtnix » 15.09.2009, 22:32

Hi rudi,

Respekt wie Du Dich in die alten Sachen reingräbst!

Das Klammerproblem bzw. Dein Code habe ich bei mir wirken lassen. Soweit ich das verstehe, Klammer ist bei den Vergleichen zwingend notwendig.

Mit dem "if_statement.diff" kann ich nun gar nichts anfangen. Denke aber mal ich könnte mir das Compiler-Teil da installieren und dieses "if_statement.diff" da irgendwo reinkopieren und mir dann selbst einen Version ziehen? Lass es mich wissen.

Zu den BigDaddy_X.txt, da finde ich
Code: Alles auswählen
if a then
Ist das ein Tippfehler oder geht das wirklich? Im Java-Tool bleibt das da hängen.

gruß gehtnix
Bild
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 + IXUS50 101b

Beitragvon rudi » 16.09.2009, 11:47

Hallo gehtnix,
das Java-Tool habe ich noch nicht ausprobiert, aber der Code
Code: Alles auswählen
if a then
sollte unter uBasic schon immer funktioniert haben. Daran habe ich keine Änderungen vorgenommen. Auf welche Quellen sich das Java-Tool stützt weiss ich nicht.

Die BigDaddy_X.txt-Dateien wurden durch direkte Umleitung der Debuggerausgaben in eine Textdatei generiert - also kein Tippfehler.

Beim Compilieren der neuen ubasic.c mit der CHDK-Shell musste ich noch eine Warnung beseitigen, darum habe ich die vorherige diff-Datei gelöscht. Dafür findest du im Anhang die geänderte ubasic.c. Die kann man im CHDK-Shell > trunc-Verzeichnis einfach mal austauschen um eine CHDK-Testversion zu compilieren.
Um dir ein schnelles Testen zu ermöglichen, ist eine fertige BIN-Datei für deine A610-100E im Anhang.

Grundsätzlich ist mir aufgefallen, dass die derzeitige IF-Anweisung keine Fehlermeldungen erzeugt haben kann - Fehlermeldungen des Parsers zeigten nur Zeilennummern nach dem IF-Block oder ganz auf das Programmende. In meiner veränderten Version habe ich darauf geachtet, dass Programmierfehler frühzeitig erkannt werden (z.B. das ENDIF in einer einzeiligen Anweisung).

Gruß Rudi
Zuletzt geändert von rudi am 18.09.2009, 12:06, insgesamt 3-mal geändert.
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 509
Registriert: 11.09.2009, 11:27
Kamera(s): A590IS_101B, SX260_100B

Beitragvon msl » 16.09.2009, 12:12

Hallo rudi,

gute Arbeit, Bild

Eine Bitte habe ich. Erzeuge doch bitte Standard-Diff/Patch-Dateien. Deine mittlerweile gelöschte Diff-Datei war mit der hier im Forum verbreiteten Standardumgebung nicht einzulesen.

Die ganze ubasic.c-Datei ist auch nicht schlecht. Da sieht man dann aber die Unterschiede nicht auf einen Blick.

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

Beitragvon gehtnix » 16.09.2009, 13:22

Hi Rudi,

danke für die Version der A610. Bild

Zuerst einmal, läuft ohne Fehler durch. Später werde ich mal bei md-six.bas die endif rausnehmen, bin gespannt.

Wenn das "if 0" so zu verstehen ist, dass die obige if-Anweisung übernommen werden soll, so funktioniert sie nicht, oder ich versteh das "if 0" nicht.
Ich hab das mal umgemodelt, 1 1 wird nicht gedruckt.

Code: Alles auswählen
print "NEU: IF-KONSTRUKT"

for n=0 to 5
   
   if n=1 then
      if 0 then
         print "Zähler = "n, 1
         sleep 1000
      else
         print "Zähler = "n, 2
         sleep 1000
      endif
      print "Zähler = "n, 3
      sleep 1000
   else
      print "Zähler = "n, 4
      sleep 1000
   endif
next n

end



Mit der Kamera und Deiner Version getestet. Mit CHDK 800 + "if 0"bekomme ich 17x print mit Deiner 799er Version + "if 0" 7x print.

gruß gehtnix
Bild
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 + IXUS50 101b

Beitragvon BigDaddy » 16.09.2009, 13:33

Hi,

[Ja verdammt. Jetzt haben gehtnix und ich anscheinend fast gleichzeitig einen Beitrag geschrieben, habe meinen abgesandt, und er war weg! Jetzt kann ich das nochmal tippen. Ist so ein Problem bekannt?]

wow, wow und nochmals wow! Hatte leider in den letzten Tagen extrem wenig Zeit, habe aber trotzdem ganz begeistert verfolgt, was rudi hier macht!

Zunächst zur früheren Frage von gehtnix:

Code: Alles auswählen
if a then

Ist das ein Tippfehler oder geht das wirklich? Im Java-Tool bleibt das da hängen.


Wie rudi schon schrieb, ist das syntaktisch korrekt so und funktioniert auch. (Auch in UBDebug. Bist du sicher, dass das bei dir einen Fehler macht?)
Der Interpreter wertet jede Zahl = 0 als false und jede Zahl <> 0 als true. Das ist korrekt und auch so dokumentiert.
Und das Ergebnis jeder relationalen oder logischen Operation wird als 0 (für false) oder 1 (für true) zurückgegeben.

Folgendes funktioniert also zum Beispiel:

Code: Alles auswählen
a = 0
b = 1

if a then print "a is true"
if b then print "b is true"

a = 1>2
b = 1<2

print a, b

print 1>2, 1<2

und liefert folgenden Output:
b is true
0 1
0 1

Der Fehler, den es in diesem Zusammenhang gibt, betrifft nur die Priorität der Auswertung von Ausdrücken. (Nicht klar, ob das wirklich streng ein "Fehler" ist, da es wahrsch. nirgends dokumentiert ist, wie es sich verhalten sollte. Aber es ist zumindest unerwartet.):

Der Ausdruck (6-3)>2 wird korrekt ausgewertet in der Reihenfolge (6-3)=3 und 3>2 und liefert also korrekt 1 (= true) zurück.
Der Ausdruck 6-3>2 wird falsch (unerwartet) ausgewertet in der Reihenfolge 3>2=1 (= true) und 6-1 und liefert also 5 zurück. (Was vielleicht nicht auffällt, da ebenfalls true! Aber mit anderen Zahlen wie z.B. (6-6)>2 und 6-6>2 wird false (korrekt) und true (falsch) geliefert.)

Soweit also alles ganz klar. Das hat m.W. mit dem "IF-Bug" (bzw. den "IF-Bugs") gar nichts zu tun! Die Lösung ist auch ganz einfach, weil es genügt, halt die Klammern zu setzen.


Jetzt aber zum eigentlichen Thema, dem IF-Bug:

Eigentlich hatte ich ja nur erhofft, dass es uns gelänge, Klarheit (in Form von hoffentlich ein paar ganz wenigen Regeln) zu schaffen, was "verboten" ist und was nicht, um den/die Bug(s) zu umschiffen. Das war mein Ansatz zu Beginn. (Den ich aus Zeitgründen leider nicht mehr fortsetzen konnte bisher.)

Aber falls es Hoffnung gibt, den Fehler zu beheben, wäre das natürlich viel besser! Ist es denn denkbar, dass so ein gefixter Code von rudi bald ins offizielle Build aufgenommen würde?

Kann selber leider hier nichts beitragen, würde mich aber schon gerne zum Testen anbieten, wenn es Sinn macht. (Benötigte dann ein Build für die A620.)

Noch schöner (weil viel bequemer) wäre es natürlich, wenn man Dave Mitchell, den Autor von UBDebug, überreden könnte, sein Tool testhalber mit der korrigierten uBasic Variante zu kompilieren. (Bin aber nicht sicher, ob die DLL und die Java-Lib, die er benutzt, von ihm selber erzeugt wurden.) Zumindest was den kürzlichen gosub..return Bug anbelangte, war er ja sehr kooperativ und fix!
Grüße
BigDaddy
__________________
A620 Firmware v100f
CHDK v0.9.8-794
BigDaddy
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 32
Registriert: 04.09.2009, 15:05
Wohnort: München

Beitragvon msl » 16.09.2009, 13:54

BigDaddy hat geschrieben:Ist es denn denkbar, dass so ein gefixter Code von rudi bald ins offizielle Build aufgenommen würde?

Klar ist das möglich. Wenn alles richtig läuft, kann man den Fehler im Bugtracker vortragen und dazu die passende Lösung als Patch-Datei anbieten. Dann wird sich schon einer der Entwickler erbarmen, die Änderung einzupflegen.

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

Beitragvon rudi » 16.09.2009, 16:48

Hallo,
ich habe für Interresierte eine DOS-Version des uBASIC Interpeters compiliert, wie ich ihn zum testen verwende. Allerdings weiss ich nicht, wie er sich bei Kameraeigenen Funktionen und Befehlen verhält.
Code: Alles auswählen
in der Eingabeaufforderung
ubasic input.bas
  bzw.
ubasic_d input.bas > output.txt //Debugger-Version mit Ausführichen Infos siehe dann output.txt


Gruß Rudi
Zuletzt geändert von rudi am 18.09.2009, 12:05, insgesamt 3-mal geändert.
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 509
Registriert: 11.09.2009, 11:27
Kamera(s): A590IS_101B, SX260_100B

Beitragvon gehtnix » 16.09.2009, 17:38

Hallo,

also soeben noch mal die BigDaddy2.bas. Habe den Anhang übersehen :oops: und erst jetzt gelöscht, "if a then" ist OK, wird abgeabeitet.
Dennoch steigt der Java-Debugger mit Line 29: Parse err aus, letzte Zeile+1. Das kennen wir, der darf ja noch nicht richtig laufen.

Erste Meldung mal zu Md_Six so wie es hier zum Download bereit steht.
Skript geladen, zur Sicherheit die Standardparameter geladen.
Nach Start, Zeile 78 Parse err.
Zeile 77 ein if mit endif, das endif gelöscht und nun
Zeile 87 Parse err - if t>0 or w>0 then

In der Abfrage kann ich aber nichts verdächtiges finden.

Nun noch Susi2Stack.bas, die letzte If-Falle die ich hatte.
Zeile 52 das endif raus, nun ein 56 Pars err
In Zeile 56 - get_focus G

Alles in der Kamera getestet.

Vorerst mal Bild

gruß gehtnix
Bild
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 + IXUS50 101b

Beitragvon BigDaddy » 16.09.2009, 18:37

Hi rudi,

super, vielen Dank für deine Sachen hier! Das ist echt genial =D>

Ich habe angefangen, mit deinem DOS-Tool systematisch einige Fälle durchzutesten.
Alles was ich früher getestet hatte (und was in der Original-uBasic-Version schief lief), funktioniert jetzt!

Bin mit den Tests noch lange nicht durch, aber trotzdem hier schon mal Rückmeldung, weil ich ein Problem schon gefunden habe, und zwar ein ganz komisches.

Test-Code:

Code: Alles auswählen
01  rem Testing IF constructs
02  @title TestIF07a
03 
04  a=0
05  b=0
06  gosub "tryif"
07  a=0
08  b=1
09  gosub "tryif"
10  a=1
11  b=0
12  gosub "tryif"
13  a=1
14  b=1
15  gosub "tryif"
16 
17  end
18 
19  :tryif
20  print ""
21  print "case", a, b
22  if a then
23     print "if a"   
24     if b then print "if b" else print "b else"
25  else
26     print "a else"
27  endif   
28  return


Dieser Code läuft völlig korrekt.

ABER: es wird ein parse error gemeldet, wenn ich die Reihenfolge der Zeilen 23 und 24 vertausche.
Ich dachte zunächst, es könnte daran liegen, dass das zweite if nun direkt auf das erste folgt. Aber lustigerweise tritt der Fehler nicht auf, wenn ich die "print"-Zeile ganz lösche.

Also so:
Code: Alles auswählen
22 if a then
23     print "if a"   
24     if b then print "if b" else print "b else"
25 else
LÄUFT.

Code: Alles auswählen
22 if a then
23     if b then print "if b" else print "b else"
24     print "if a"   
25 else
-> parse error near line 25

Code: Alles auswählen
22 if a then
23     if b then print "if b" else print "b else"
24  else
LÄUFT.

Ziemlich strange.
Grüße
BigDaddy
__________________
A620 Firmware v100f
CHDK v0.9.8-794
BigDaddy
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 32
Registriert: 04.09.2009, 15:05
Wohnort: München

Beitragvon gehtnix » 16.09.2009, 23:18

Hallo,

jetzt habe ich mal weiter in Susi2Stack nachgesehen und Versuche gemacht.
Also in Zeile 52 das endif löschen. Schaut dann so aus und ergibt dann Fehler

Code: Alles auswählen
if S=0 then
   release "shoot_half"
   Z=Z+1
   cls
   print "Fokus nicht OK"
   print "Kamera neu ausrichten"
   print "Ich wiederhole den Fokus"
   print "zum", Z; ". mal."
   if Z=10 then goto "restore"
   sleep 3000
   goto "neufok"
endif


Löscht man diese beiden Zeilen dann geht es. Auskommentieren reicht nicht.
Code: Alles auswählen
   sleep 3000
   goto "neufok"


In Zeile 90, das ist unverändert und wird korrekt abgearbeitet.
Code: Alles auswählen
if E>99 then
      gosub "meter"
      if N<10 then
         print "* Startpunkt = ";M;","0""N" m"
      else
         print "* Startpunkt = ";M;","N" m"
      endif
   else
      print "* Startpunkt = ";E,"cm"
endif


Es ist derselbe Fehler wie ihn oben BigDaddy beschreibt.

gruß gehtnix
Bild
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 + IXUS50 101b

Beitragvon rudi » 17.09.2009, 06:44

Hallo Ihr Zwei

Ich habe das Problem, Dank der sehr schön beschriebenen Fehler, gestern Abend gefixt (das Flag für die einzeilige IF-Anweisung wurde am Zeilenende nicht zurückgesetzt).
Nachdem ich die Anhänge für die A610, A620 und ubasic.c aktualisiert hatte, wollte der Web-Server keine Verbindung mehr mit mir haben, um den dazu gehörenden Beitrag anzunehmen.
Die Debugger-Dateien habe ich erst einmal zurückgenommen, kann Sie aber auf Wunsch wieder einstellen.

Nachtrag @gehtnix
Ich habe gerade mit der Susi getestet. Nach mehrerem Neufokusieren erhielt ich einen Fehler in Zeile 45. Ich vermute die Ursache dafür in Zeile 54
Code: Alles auswählen
goto "neufok"
Da das ENDIF nicht abgearbeitet wird, und die IF-Anweisung jedesmal neu aufgerufen wird, sollte der IF-Stack überlaufen.
[etwas später...] So jetzt habe ich es nachgewiesen, siehe IF-Stack.zip.
Die derzeitige IF-Konstruktion erzeugt keinen Fehler beim IF-Stacküberlauf, so dass die Ergebnisse weiterer IF-Anweisungen nicht mehr gespeichert werden können und ELSE nur noch das Ergebnis des 4. IFs zur Auswertung hat. Deswegen wird ab dem 4. Durchlauf kein PRINT-Befehl in der GOSUB-Routine ausgeführt.

Gruß Rudi
Dateianhänge
IF_Stack.zip
IF_Stack.bas
(1.27 KiB) 125-mal heruntergeladen
Zuletzt geändert von rudi am 18.09.2009, 12:04, insgesamt 4-mal geändert.
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 509
Registriert: 11.09.2009, 11:27
Kamera(s): A590IS_101B, SX260_100B

Beitragvon BigDaddy » 17.09.2009, 07:41

Hi rudi,
klingt gut dass du das so schnell gefunden hast.
Bitte stelle die aktualisierte DOS-Version nochmal ein, sobald es wieder geht. Ich werde dann gründlich weiter testen. (Das auf der Kamera zu machen, ist doch zu unbequem, da geht die meiste Zeit für den Kartenwechsel drauf.)
Grüße
BigDaddy
__________________
A620 Firmware v100f
CHDK v0.9.8-794
BigDaddy
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 32
Registriert: 04.09.2009, 15:05
Wohnort: München

VorherigeNächste

Zurück zu Code-Ecke

Wer ist online?

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

cron