[uBasic] Neues aus Ifthisdan

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

Neues aus Ifthisdan

Beitragvon gehtnix » 01.09.2008, 20:26

Hallo,

ein weiteres IF-Problem - auch wenn Endif gesetzt ist.
Auch unter Allbest!

So wie die 6 Codezeilen in dem Beispiel stehen, macht das natülich keinen Sinn.
Ich habe aus dem Ursprung-Script alles Überflüssige rausgelöscht.
Das IF auf Zeile 17 steht im Ursprungs-Script auf Zeile 103
Ende hier auf Zeile 22, im Urspung-Script auf 134.

Der Fehler steht also nicht mit weiteren IF´s im Zusammenhang.
Wenn man hier das "endif" in Zeile 18 löscht erscheint der bisher bekannte Fehler zusätzlich.

Script anbei.

gruß gehtnix
Dateianhänge
IF-Fehler.bas
(419 Bytes) 388-mal heruntergeladen
Zuletzt geändert von gehtnix am 04.09.2008, 22:28, insgesamt 2-mal geändert.
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 gehtnix » 02.09.2008, 17:54

Hallo,

mir sitzt das If-Problem im Nacken, aber unfreiwillig!

Heute habe ich in ein bestehendes Sript (Basis der If-Fehler.bas) eine weitere If-Anweisung geschrieben, so wie sie in der Fehlermeldung beschrieben ist und eigentlich ja gar nicht laufen sollte.
Diesmal lief diese Anweisung fehlerlos durch.
Geschickt dachte ich, mal rüberkopiert in die IF-Fehler.bas, und siehe da jetzt brachten die 3 neuen Zeilen wieder den Fehler hervor, lies sich aber mit dem zusätzlichen endif nicht beheben!

Leider habe ich das nicht abgespeichert und die zweite If-Abfrage habe ich zwischenzeitllich verändert, und jetzt läuft es. Wieso auch immer?

Absolut verwirrend!

Der Fehler muß unter Allbest auch erscheinen!

Zum Testen und nachvollziehen des "Fehlers" downloaden. Vorteil, man kann sich Zeile für Zeile durchklicken und hat dabei die Paramter im Auge.
http://www.zenonic.demon.co.uk/zips/UBDB.zip
http://www.zenonic.demon.co.uk/zips/UBDB.pdf

In der Datei habe ich alles unnötige rausgeschmissen.
Zwei Kern-If-Abfagen, beide sollten nicht ausgeführt werden, und zum Schluß sollte "Richtig!" ausgegeben werden.
Die erste Abfrage wird korrekt ausgeführt.

In der zweiten häufen sich jetzt die Fehler:
a) Diese "if x<>0 or y<>0 then" sollten genau wie die Erste nicht ausgeführt werden. Es wird aber
__in "irgendeiner" Zeile eingesprungen. Dabei wird
b) eine weitere If-Anweisung ausgelassen.
c) Dann folgt zweimal print, das wird ausgeführt, und
d) die obige If-Anweisung nochmals wiederholt, wird jetzt ausgeführt.
e) Zum Schluß nochmal 2x print und fertig mit einem Sprung aus der If-Anweisung.

Setzt man jetzt den x-Parameter auf 1 so werden diese beiden (b,d) If-Anweisungen richtig ausgeführt.

Durch blinden Zufall Meinerseits habe ich Möglichkeiten zur Beseitigung von IF-Problemen gefunden:
Code: Alles auswählen
a)    If a=b then
         xxx
         xxx
      endif
      
      mit
      
      if a<>b then goto "sprung"
      xxx
      xxx
      
      :sprung
      
      ersetzen.
      
b)   If a<b then
         (if b<d then print "fertig" endif)
         xxx
         xxx
      endif
      
      Das zweite If in eine Klammer () setzen.
      
c)    If a<b then
         rem ---
         if b<d then print "fertig" endif
         
      Zwischen den beiden If ein rem einfügen
         
d)    If a<b then
         print "a<b",a,b
         if b<d then print "fertig" endif
                       
      Ein "print" hebt den Fehler auch auf!
      So erscheint der Fehler zunächst nicht in der Kamera.

So kann es also passieren dass man sich im Script zur Unterstützung diese "print" einbaut, dann sagt man sich, na Gut alles OK, jetzt schmeiße ich die "print" Anweisungen raus und jetzt erst hat man den Salat!

Hat in diesem Beispiel zum Erfolg geführt. Ob das überall funktioniert kann ich natürlich nicht sagen.

Einen weitere Merkwürdigkeit die ich selbst erfahren habe, die ich aber auch in anderen Scrpts entdeckt habe, sind überflüssige Klammern wie diese if (a-b)=c. Diese Klammern habe ich schon selbst gesetzt weil ohne diese Klammern nicht richtig gerechnet wurde. In Scripten die nicht von mir erstellt wurden habe ich diese auch gefunden. Einige habe ich mal gelsöcht, es wurde dennoch richtig gerechnet!
Inwieweit das mit obigen zusammenhängt? Da habe ich keine Ahnung

Das Script läuft richtig wenn man nach Zeile 17 ein "rem ---" einfügt.

Un nochmal, wann der Fehler auftritt kann ich nicht sagen! Wie oben beschrieben, habe ich in einem Script eine if-Version mit Fehler eine ohne Fehler. Sie stehen 30 Zeilen auseinander.

@msl @fe50
Wäre es nicht geschickt diese Hnweise mit ins WIKI-Handbuch aufzunehmen. Neuscriptikern bleibt einiges erspart.

gruß gehtnix
Dateianhänge
IF-Fehler2.bas
(354 Bytes) 372-mal heruntergeladen
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 chiptune » 02.09.2008, 19:10

Hallo gehtnix,

ich gehe auch davon aus, dass hier ein Bug vorliegt!
Zu deinem ersten Beispiel:
Code: Alles auswählen
@title IF-Fehler org
@param x Start um x Uhr
@default x 0
@param y Start um x Minuten
@default y 0
@param t Zyklus-Dauer Std
@default t 0
@param w Zyklus-Dauer Min
@default w 0
@param v Intervalllänge x Min
@default v 4

v=60
w=120
t=t*3600+w

if x>0 or y>0 then
   if t>0 then A=v/2 endif
   print "Das darf nicht"
   print "ausgegeben werden!"
   goto "sprung1"
endif

print "Richtig!"

:sprung1

end

x=0 und y=0, trotzdem wird der Text "Das darf nicht ausgegeben werden" ausgegeben. Der Sprung nach "sprung1" wird korrekt ausgeführt.

Aber fassen wir die Regel etwas enger!
    Einzeilige Verzweigungen dürfen nicht mit "endif" abgeschlossen werden
    Mehrzeilige Verzweigungen müssen mit "endif" abgeschlossen werden
Code: Alles auswählen
@title IF-Fehler 02
@param x Start um x Uhr
@default x 0
@param y Start um x Minuten
@default y 0
@param t Zyklus-Dauer Std
@default t 0
@param w Zyklus-Dauer Min
@default w 0
@param v Intervalllänge x Min
@default v 4

v=60
w=120
t=t*3600+w

if x>0 or y>0 then
   if t>0 then A=v/2
   print "Das darf nicht"
   print "ausgegeben werden!"
   goto "sprung1"
endif

print "Richtig!"

:sprung1

end

Und schon funktioniert die Geschichte :D :D :D

Und nun noch etwas übermütig werden - mal die verschachtelte If-Verzweigung eine Zeile nach unten verschieben :lol:
Code: Alles auswählen
@title IF-Fehler 03
@param x Start um x Uhr
@default x 0
@param y Start um x Minuten
@default y 0
@param t Zyklus-Dauer Std
@default t 0
@param w Zyklus-Dauer Min
@default w 0
@param v Intervalllänge x Min
@default v 4

v=60
w=120
t=t*3600+w

if x>0 or y>0 then
   print "Das darf nicht"
   if t>0 then A=v/2
   print "ausgegeben werden!"
   goto "sprung1"
endif

print "Richtig!"

:sprung1

end


parse err Zeile 29 (Zeile 29 ist die Zeile nach "end")

Bei mir wurde alles mit Allbest 51-491 getestet

kopfkratzende Grüße
chiptune
SX100IS mit CHDK
MD_SLOWMD_FASTMD_TUNE
chiptune
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 131
Registriert: 16.07.2008, 05:24

Beitragvon gehtnix » 02.09.2008, 20:44

Hallo chiptune,

mit zwei Klicks kannst Du mich aber ganz schön aufs Ifeis führen.

Dei Meldung mit dem "parse err" ins Nirvana, das habe ich noch vergessen zu schreiben.
Das könnte vielleicht ein, und jetzt vorsichtig, verläßlicher Hinweis zu dieser Fehlerart sein?!
chiptune hat geschrieben:parse err Zeile 29 (Zeile 29 ist die Zeile nach "end")


chiptune hat geschrieben:Bei mir wurde alles mit Allbest 51-491 getestet
Testet Du das in der Kamera oder mit dem Java-Tool?

Du must Dir die zweite Datei "IF-Fehler2.bas" runterladen.
Da hast Du beide Varianten in einem Script, zum Kopfkratzen 8)

Mit Deiner Variante 3 bringst Du mich erst ein mal echt zum Schwitzen!
Und erst nach langem Ãœberlegen komme ich dann doch wieder zu dem Ergebnis, da fehlt das endif.
In der Reihenfolge Deiner Sichtweise bekomme ich wieder eine ganz andere Sicht auf das Problem.

Wenn man das so sauber beim erstenmal schreibt ist alles OK. Willst Du aber jetzt mit print, so wie Du das in Version 3 machst, wissen wie groß a ist, dann beschreibst Du ganz richtig "parse err".

(if t>0 then A=v/2 endif):D

So geht es wieder in Version3

Schlau werde ich daraus auch nicht.

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 chiptune » 02.09.2008, 21:04

Hallo Gehtnix,
gehtnix hat geschrieben:(if t>0 then A=v/2 endif):D

So geht es wieder in Version3

Ähm - wie geht es wieder?

Ohne parse err oder ohne parse err und richtig :D

Jedenfalls ist hier was oberfaul. Erst dachte ich, es hängt mit dem Aussprung zusammen - aber offensichtlich doch mit dem "endif".

Dein anderes Beispiel-BAS werde ich mir morgen zur Brust nehmen.
[EDIT]
Ich habe mir dein zweites Beispiel gerade angesehen - es ist deutlich komplexer aufgebaut als das erste Beispiel.
Um den Fehler einzugrenzen, macht es mehr Sinn, das erste Beispiel soweit abzuspecken, bis es erwartungsgemäß läuft. Werde abends noch weiter experimentieren.

Um denen, die hier mitlesen das zeitaufwendige Testen zu ersparen, sollten wir die beobachteten Reaktionen detailliert vermerken und den Script-Code im Text zeigen.
[/EDIT]

Grüße
chiptune

PS: Ich habe mit der Cam getestet (wollte ja das reale Verhalten ansehen)
SX100IS mit CHDK
MD_SLOWMD_FASTMD_TUNE
chiptune
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 131
Registriert: 16.07.2008, 05:24

Beitragvon chiptune » 03.09.2008, 11:11

@gehtnix
mit dem Debugger geht es wirklich einfacher

@All
Ich habe mal den Test-Scriptcode auf das Notwendigste minimalisiert.
Entscheidende Punkte für korrekten Ablauf oder Fehler sind, mit oder ohne endif, und ob die verschachtelte IF-Verzweigung unmittelbar oder in einer folgenden Zeile platziert ist.
+++++++++++++++++++++++++++++++++++++++++++++++++++++
Fall 1 - IF-Verzweigungen folgen unmittelbar aufeinander; Verschahtelte IF-Verzweigung ohne "endif"

Code: Alles auswählen
@title 1.Z ohne endif
x=0
t=120
if x>0 then
   if t>0 then A=2
   print "Das darf nicht"
   goto "sprung1"
endif
print "Richtig!"
:sprung1
end


Fehlerhafte Abarbeitung: x=0, trotzdem wird "Das darf nicht" gedruckt
+++++++++++++++++++++++++++++++++++++++++++++++++++++
Fall 2 - IF-Verzweigungen folgen unmittelbar aufeinander; Verschahtelte IF-Verzweigung mit "endif"

Code: Alles auswählen
@title 1.Z mit endif
x=0
t=120
if x>0 then
   if t>0 then A=2 endif
   print "Das darf nicht"
   goto "sprung1"
endif
print "Richtig!"
:sprung1
end


Korrekte Abarbeitung: "Richtig!" wird gdruckt
+++++++++++++++++++++++++++++++++++++++++++++++++++++
Fall 3 - Zwischen den beiden IF-Verzweigungen befinden sich eine oder mehrere Zeilen mit Anweisungen; Verschahtelte IF-Verzweigung ohne "endif"

Code: Alles auswählen
@title 2.Z ohne endif
x=0
t=120
if x>0 then
   print "bla"
   if t>0 then A=2
   print "Das darf nicht"
   goto "sprung1"
endif
print "Richtig!"
:sprung1
end


Scriptfehler - parse err!!!
+++++++++++++++++++++++++++++++++++++++++++++++++++++
Fall 4 - Zwischen den beiden IF-Verzweigungen befinden sich eine oder mehrere Zeilen mit Anweisungen; Verschahtelte IF-Verzweigung mit "endif"

Code: Alles auswählen
@title 2.Z mit endif
x=0
t=120
if x>0 then
   print "bla"
   if t>0 then A=2 endif
   print "Das darf nicht"
   goto "sprung1"
endif
print "Richtig!"
:sprung1
end


Korrekte Abarbeitung: "Richtig!" wird geprintet
+++++++++++++++++++++++++++++++++++++++++++++++++++++

Grüße
chiptune
Dateianhänge
endif.zip
entsprechende Ubasic-Scripte
(879 Bytes) 383-mal heruntergeladen
SX100IS mit CHDK
MD_SLOWMD_FASTMD_TUNE
chiptune
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 131
Registriert: 16.07.2008, 05:24

Beitragvon gehtnix » 03.09.2008, 13:48

Hi Chiptune,

=D> , und jetzt zur nächsten Übung.

Kopiere doch mal bitte Deinen "lauffähigen Code", Fall2, in meine If-Fehler2.bas als letzte If-Abfrage.
In der Zweiten If dann das Sprung rauslöschen.

Dein Fall 2
Code: Alles auswählen
x=0
t=120
if x>0 then
   if t>0 then A=2 endif
   print "Das darf nicht"
   goto "sprung1"
endif
print "Richtig!"
:sprung1


Und jetzt, kopfkratz, geht er nicht mehr. :-`
Das ist ja das hundsgemeine an dem Ding!

Zudem steht es im Widersspruch zu ersten Abfrage, da funktioniert es ja!

Die Abfragen in der if-fehler2.bas sind in dem Umfang bewußt so gehalten.
Mein, mit nichts zu belegender, Verdacht, dass es auch an der Form der Abfrage liegen könnte.
Könnte aber auch am Luftdruck oder Wasserstand liegen :D

Wieso wird die komplexe erste If-Anweisung richtig behandelt?

geschmeidig bleiben

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

Neues aus Ifthisdan

Beitragvon gehtnix » 04.09.2008, 22:23

Hallo ihr Scriptiker,

wie sagt man im Spiel, man hat einen guten Lauf!
Den habe ich wohl im anderen Sinne gerade auch. Ich stolper über alle ungelegten Eier von uBasic.

So auch heute.

Aber fangen wir ganz einfach an:

Das hier läuft.
Code: Alles auswählen
A=10
B=5

if A-B>1 then
 print "Kein Fehler"
endif

if A-B>1 then print "Kein Fehler"

end



Das läuft auch noch
Code: Alles auswählen
A=5
B=10

if A*B<75 then
   if A*B<22 then print "A*B ist nicht kleiner"
endif

end



Aber hier ist Schluß! Was ganz einfaches. Und da hilft auch kein endif, denn dann stürzt es erst recht ab.
Code: Alles auswählen
A=10
B=5

if A-B<6 then
   if A-B<2 then print "A-B ist nicht kleiner"
endif

end



Des Rätsleslösung, wie ich schon mal vermutet habe ist die unsinnige Klammer bei (A-B)

Code: Alles auswählen
A=10
B=5

if A-B>6 then
   if (A-B)>2 then print "Darf nicht ausgeführt werden"
endif

end



Aber aufgepasst, das zweite if darf gar nicht erreicht werden da jetzt die Operatoren umgedreht sind.
Jetzt fällt deutlich auf, die erste if wird, weil falsch und ohne Klammer, ignoriert. Daher gelangt er erst zum zweiten if. Dies wird jetzt, korrekt mit Klammer, ausgeführt. Es wird richtig ausgedruckt.
Also es müssen richtigerweise zwei Klammer stehen!

Aber oh Schreck und Graus, wieso geht es dann mit dem multiplizieren? Fall2?

Alles klar :D ](*,) :-` :-({|=

geschmeidig bleiben ist hier nun wirklich angesagt :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

Beitragvon devhh » 05.09.2008, 09:43

Compilerbau <-- hilft vielleicht.. ;-) scnr

Ist der Interpreter "Handarbeit" oder mit yacc/bison/etc gebaut?
IXUS 70 CHDK [de-autobuild]
devhh
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 9
Registriert: 06.08.2008, 12:49

Beitragvon PhyrePhoX » 05.09.2008, 12:24

Soweit ich weiss Handarbeit.

http://tools.assembla.com/chdk/browser/ ... okenizer.c
http://tools.assembla.com/chdk/browser/ ... c/ubasic.c

da ist alles drin.

ubasic wurde in ein paar stunden zusammengefrickelt: http://www.sics.se/~adam/ubasic/
Benutzeravatar
PhyrePhoX
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 490
Registriert: 04.07.2008, 21:31

Beitragvon gehtnix » 05.09.2008, 12:51

Hallo,

das wahrscheinlich kürzeste uBasic-Programm der Welt!

Code: Alles auswählen
ifnix
end

: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


Zurück zu Code-Ecke

Wer ist online?

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

cron