[geklärt] An die Script-Kollegen & juciphox-User

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

An die Script-Kollegen & juciphox-User

Beitragvon gehtnix » 27.08.2008, 13:24

Hallo,

nach dem meine Anfragen auf Disfunktionen in uBAsic und juciphox nicht beantwortet werden möchte ich die Scriptwütigen unter euch auf folgendes hinweisen:

Unter
viewtopic.php?t=468
gibt es bereits den Hinweis, sei aber hier nochmals dargestellt:

Bei if-Anweisungen kann es bei dieser Schreibweise zu unergründlichen Verhaltensweisen wie Stillstand der Kamera oder irgendwelchen unsinnigen Programmfolgen kommen. Das Gemeine daran, steht if z.B in Zeile 10 und man schreibt in Zeile 50 was neues dazu, meint man doch der Fehler würde in Zeile 50 liegen! Kann sein, kann aber eben an dem fehlenden endif liegen.

Beispiel:
if a=b then c=d

Um sich Zeit zu sparen kann ich aus eigener Erfahrung nur anempfehlen unter juciphox das so zu schreiben

if a=b then c=d endif

oder so

if a=b
then c=d
endif

Wann, Wieso und Warum der Fehler zuschlägt, kann ich nicht sagen! Sagen kann ich aber, dass ich schon etliche Stunden damit verbracht habe an anderen Stellen im Script einen Fehler zu vermuten. Nach einem hinzufügen von endif lief das Script.

Eine weitere Hürde kann man sich ersparen wenn man den z-Parameter nicht verwendet.
So:

rem @param z Zyklus 0=Aus 1=Ein
rem @default z 1

wird er unter den Parameteroptionen gleich gar nicht angezeigt. Das ist aber von mir auch schon beschrieben worden.

Keine Kommunkation ist auch eine Kommunkation! Alles Weitere zu obigem Thema wurde ja eben nicht gesagt!



gruß gehtnix
Zuletzt geändert von gehtnix am 28.10.2009, 14:40, 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 fe50 » 27.08.2008, 14:04

Hi gehtnix,

ein abschliessendes endif ist für einen "ordentlichen" Programmierer doch eigentlich selbstverständlich ;)
(das Selbe gilt übrigens auch für LUA, dort müssen Blöcke auch immer abgeschlossen sein)

Ist eigentlich nur z betroffen oder ist es mit Z das Selbe ?

...a-y + A-Z sollte doch eigentlich für ein Kamerascript reichen, oder ?

Ursprünglich war uBasic für kleine, zweckgebundene Scripte konzipiert, mittlerweile haben wir aber recht große "Universalscripts" mit massig Einstellungen, Parametern und Variablen - uBasic ist da nicht gerade die beste Sprache dafür...

Ich denke mit LUA wird da zukünftig eine deutlich bessere Alternative für große Scripts heranwachsen, das ist schon eher eine Programmiersprache...

Vorteile von LUA sind u.a. die Geschwindigkeit, beliebige interne Variablen, mehr Datentypen, saubere Gliederungen durch Funktionen und auslagerbare Bibliotheken, Kommentare im Code, einfach ein logischer Aufbau...
◄"The grass was greener, The light was brighter"►  ◄fe50 home►  ◄TRAIL-Magazin►  ◄RTFM !►
Benutzeravatar
fe50
CHDK-Legende
CHDK-Legende
 
Beiträge: 1106
Registriert: 25.04.2008, 14:28
Wohnort: B'Württemberg
Kamera(s): Ixus50 101b, Ixus860 100c, SX10 101a

Beitragvon gehtnix » 27.08.2008, 16:17

Hi fe50,

allbest-Scripte kenne diese Probelme nicht!

Nichts ahnend nimmt jemand ein "geprüftes" allbest-Script und will dort eine Anpassung machen.
Dann kann er zumindest mit endif unter juciphox sein Waterloo erleben. Denn bisher lief ja alles Bestens!
Und das Hundsgemeine ist, selbst erlebt, dass durch das fehlende "endif", sich das Programm auf einmal "willkürlich" an einer Zeile aufhängt. Dieser Part wurde aber vorher sauber übersprungen! Also z.b. von Zeile 10-50 normales click und clack, dann eine Sprunganweisung zu Zeile 100. Dann baust Du in 150 eine neue Anweisung dazu und jetzt hängt das Script in Zeile z.B. 77. Und wenn eine Fehlermeldung kommen sollte dann könnte die dann ein parserror mit Angabe der allerletzte Zeile sein!

Nur z betroffen da man Z nicht als @param verwenden kann. Das große Z ist bisher nicht negativ aufgefallen, möchte ich dem Z auch nicht anraten! :) Vermeide aber das gezielte Einsetzen von Z!

Ich hätte das z schon gebraucht! Inzwischen habe ich alles umgeschmissen und verfolge eine andere Linie, habe jetzt sogar zwei Parameter übrig :lol:
Zum Anderen, wenn jemand wahllos nur zwei Parameter hernimmt so steht er schon mit a und z dumm da.

Es wird noch eine Zeit dauern bis LUA zum Standard geworden ist. Und bis dahin uBasiceln wir weiter.

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 msl » 27.08.2008, 16:24

Ich habe mir sicherlich bisher keine großen Gedanken zu endif gemacht und es aus Bequemlichkeit und Vergesslichkeit in Unwissenheit der Konsequenzen einfach weggelassen. Wenn man den Beschreibungen folgt, gehört es einfach dazu.

Die nicht nutzbare Parametervariable a sollte aber ein lösbares Problem sein. Unter Allbest ist sie ja verfügbar. Demzufolge kann eine Lösung nicht so weit weg sein.

uBasic wird immer 1. Wahl für den "kleinen Mann" bleiben. Es hat einfache und für Nichtprogrammierer schnell zu begreifende Strukturen.

LUA hat sicherlich seine Vorteile, die man besser erkennen könnte, wenn eine Sammlung der typischen Skriptanwendungen zur Verfügung stände.

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

Beitragvon chiptune » 27.08.2008, 19:54

Mit endif wird aber auch nicht immer alles gut :lol:

Konstrukte wie:

if x=1 then
blabla
blabla
blabla
else
blabla
goto xyz
endif

.. funktionieren nicht uneingeschränkt. Hatte bislang keine Muße den Effekt näher einzugrenzen.

So geht es jedenfalls:

if x=1 then
blabla
blabla
blabla
endif
if x<>1 then
blabla
goto xyz
endif

Sieht bescheuert aus, funktioniert aber.

Gruß
chiptune
SX100IS mit CHDK
MD_SLOWMD_FASTMD_TUNE
chiptune
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 131
Registriert: 16.07.2008, 05:24

Beitragvon gehtnix » 27.08.2008, 20:53

Hi Chiptune,

da brat mir doch einer ´nen Storch!

In Deinem Beispiel wird beides ausgeführt.
Code: Alles auswählen
@title Test
@param x test
@default x 0

if x=1 then
   print "x=11"
   print "x=12"
else
   goto "test"
endif

:test
   print "x=21"

end



Aber guckst Du hier, viewtopic.php?t=423 Timer gesteuerte Bewegungserkennung (md) mit LCD-Abschaltung, da steht das hier und wird einwandfrei verarbeitet.

Code: Alles auswählen
if s<>2 and y=1 then
   let s=2
else if s=2 and y<>1 then
   let s=0
endif


Und beides unter juciphox

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 gehtnix » 27.08.2008, 22:57

Hallo,

das fällt mir auch jetzt erst auf!

Da haben wir ein dickes Problem mit dem was Chiptune ermittelt hat!

Denn mit seiner simplen Anweisung kann es ja tatsächlich vorkommen, dass ein Allbest-Script
unter juciphox nicht mehr läuft!

Der Neueinsteiger steht hier vor einem dicken Problem!

Ich habe jetzt nachträglich den Titel abgeändert.

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 » 28.08.2008, 07:06

Hallo gehtnix,

es ist ja nicht so, dass dieses Konstrukt grundsätzlich nicht funktioniert (das wäre zu einfach) - in meiner Ausprägung hat es jedenfalls nicht funktioniert. Kann jetzt auch nicht sicher behaupten, ob es mit Juciphox oder Allbest nicht funktionieren wollte.

Ich glaube ich hatte nach else statt "goto xyz", "if .... then goto xyz" stehen. Auch das sollte eigentlich funktionieren, da bis zu 4 levels zulässig sind.

Werde es jedenfalls versuchen näher einzugrenzen.

melde mich wieder
chiptune
SX100IS mit CHDK
MD_SLOWMD_FASTMD_TUNE
chiptune
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 131
Registriert: 16.07.2008, 05:24

Beitragvon gehtnix » 28.08.2008, 11:01

Hallo,

sorry, da habe ich aber selber ein Fehler gemacht!

Bei dem Test-Script oben, da habe ich geschlafen! Es ist klar dass dort drei Werte gedruckt werden.

Umgestellt mit

Code: Alles auswählen
@title Test
@param x test
@default x 0

if x<>1 then
   print "x=11"
   print "x=12"
else if x=1 then
   gosub "test"
endif

end

:test
   print "x=21"



So läuft es richtig.

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 » 28.08.2008, 15:54

Hallo,

hab es gerade damit unter Allbest-491 und Juciphox-491 ausprobiert:
Code: Alles auswählen
@title if else endif
@param a If-Parameter
@default a 2
T=1
if a=1 then
   cls
   print "if a=1"
else
   cls
   print "else a<>1"
   if T=1 then goto "JumpElse"
endif
goto "ScriptEnd"
:JumpElse
print "Sprung aus else OK"
rem mit den Defaultwert müsste die geprintet werden
:ScriptEnd

mhm - keinerlei Mängel :?
SX100IS mit CHDK
MD_SLOWMD_FASTMD_TUNE
chiptune
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 131
Registriert: 16.07.2008, 05:24

Beitragvon PhyrePhoX » 28.08.2008, 16:04

ich sehe nicht so richtig durch ehrlich gesagt. Was genau ist jetzt der Bug und was nicht? Dass man if mit endif abschliessen muss?
Benutzeravatar
PhyrePhoX
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 490
Registriert: 04.07.2008, 21:31

Beitragvon fe50 » 28.08.2008, 16:20

PhyrePhoX hat geschrieben:ich sehe nicht so richtig durch ehrlich gesagt. Was genau ist jetzt der Bug und was nicht? Dass man if mit endif abschliessen muss?
Hmm, ich denke das Problem ist, dass ältere Versionen ein fehlendes endif unter bisher nicht genau geklärten Bedingungen "verdaut" haben, neuere Versionen aber bei fehlendem endif manchmal undefiniert in die Wüste rennen...
Je größer das Script bzw. die Verschachtelungstiefe, desto eher scheint das aufzutreten...

Bei einer "sauberen" Programmierung - also jedes 'if' mit 'endif ' abgeschlossen - sollte es passen, da sind mir bisher keine nachvollziehbaren Fehler untergekommen.

Das 2. Problem scheint wohl zu sein, das der Parameter "z" (klein) in der Parameterliste nicht erscheint...
◄"The grass was greener, The light was brighter"►  ◄fe50 home►  ◄TRAIL-Magazin►  ◄RTFM !►
Benutzeravatar
fe50
CHDK-Legende
CHDK-Legende
 
Beiträge: 1106
Registriert: 25.04.2008, 14:28
Wohnort: B'Württemberg
Kamera(s): Ixus50 101b, Ixus860 100c, SX10 101a

Beitragvon PhyrePhoX » 28.08.2008, 21:58

ok. das mit dem z hab ich ja schon in meiner queue zu fixen, hab nur noch keine ahnung wo ich ansetzen kann. brauchen echt langsam mal nen echten bugtracker.
Benutzeravatar
PhyrePhoX
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 490
Registriert: 04.07.2008, 21:31

Beitragvon gehtnix » 29.08.2008, 01:10

Hallo,

einfachmal dieses Script "test-endif.bas" runterladen und dann in Zeile 140, 141 und 143 das endif rausnehmen.
Dort stehen 67 "if" 13 "endif" gegenüber.
viewtopic.php?t=468
Dann kann man sehr, sehr viel Zeit bei der Fehlersuche vertrödeln!
Und wie schon mehrmals gesagt unter allbest funktioniert es bis auf die "get_propset=1".

@fe50
Ich habe mal so rumgeschaut, Microsoft, wiki usw., aber keinerlei Hinweis auf das unbedingte, "saubere" "endif" gefunden.

Und wer den endif-Fehler findet der kann sich ´nen Storch braten. :lol:

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 PhyrePhoX » 29.08.2008, 09:41

zu den parametern: http://chdk.setepontos.com/index.php/to ... l#msg16886 könnte das eventuell damit zu tun haben? Magst du dir mal ein bin bauen VOR dieser revision und testen? (Also ne Revision VOR #434)

edit: zu endif: http://ed-thelen.org/bab/bab-ubhelp.html
ist zwar nicht "unser" ubasic, aber hilft vielleicht!? Da steht recht viel über die benutzung von endif.
Benutzeravatar
PhyrePhoX
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 490
Registriert: 04.07.2008, 21:31

Nächste

Zurück zu Code-Ecke

Wer ist online?

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