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