[uBasic] "Nested if" Bug

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

Beitragvon trichtex » 02.02.2010, 17:21

Moin!

rudi hat geschrieben:nun ist unser Patch auch im int. trunk


*grummel* Einfach mal eine Weile nur von Zeit zu Zeit die Aktualisierungen einspielen, ohne vorher großartig zu lesen, ist nicht empfehlenswert. Plötzlich bringt mir mein Script download/file.php?id=32 einen Parse err in Zeile 83, wo das else-Statement steht.

<Loriot>
Ach?!?
</Loriot>

Ich habe das else und das endif 'rausgeschmissen und teste gerade.

Munter bleiben... TRICHTEX
Powershot A610 100e mit CHDK DE aktuell
trichtex
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 44
Registriert: 20.05.2008, 08:32

Beitragvon msl » 02.02.2010, 17:54

Hallo,

hier gibt es ein Testprogramm von CHDKLover zum Überprüfen auf fehlerhaften Skript-Code.

In Zeile 83 muss das else alleine stehen. Dann sollte es gehen.

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 gehtnix » 02.02.2010, 18:17

msl hat geschrieben:Mal sehen, was wir ihm aus unserer DE-Version noch verkaufen können. Bild
Na rudis neuen Patch mit dem Bug beim Stromsparmodus 8)
Da kann das Ticket im Bugtracker auch geschlossen werden

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 trichtex » 04.02.2010, 16:26

Moin!

msl hat geschrieben:In Zeile 83 muss das else alleine stehen. Dann sollte es gehen.


Damit brachte das Script immer noch einen parse error. Andererseits ist das else auch nicht wirklich notwendig. Ist die Bedingung vor else nicht erfüllt, geht es so oder so mit dem nächsten if-Statement weiter, daher sollte das else zumindest von der Programmlogik überflüssig sein.

Ich teste noch...

Munter bleiben... TRICHTEX
Powershot A610 100e mit CHDK DE aktuell
trichtex
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 44
Registriert: 20.05.2008, 08:32

Was lange währt...

Beitragvon trichtex » 06.05.2010, 14:22

Moin!

So, getestet, getestet, getestet. Läuft und läuft und läuft. Der werten Gemeinde das überarbeitete Script zum wohlwollenden Konsum ;-)


Code: Alles auswählen
rem Autor Trichtex
rem Für A610 mit CHDK-DE 1.1.0
rem Befehlsaufbau:
rem              /--/-Spalten und Zeilen, in die das Bild aufgeteilt wird
rem              |  |  Prüfmethode (Y,U,V R,G,B) - U-0, Y-1, V-2, 3-R, 4-G, 5-B
rem              |  |  |  Timeout (ms)
rem              |  |  |  |  Vergleichsintervall (ms)
rem              |  |  |  |  |  Lichtschwellwert (Unterschied in Zellen für Bewegungserkennung)
rem              |  |  |  |  |  |  Gitter zeichnen (0-Nein, 1-Ja)
rem              |  |  |  |  |  |  |  Rückgabewert, Anzahl der Zellen, in denen Bewegung erkannt wurde
rem              |  |  |  |  |  |  |  |  VVVVVV  OPTIONALE PARAMETER: VVVV
rem              |  |  |  |  |  |  |  |  Fenster: 0-Aus, 1-Ein,  2-Invertiert
rem              |  |  |  |  |  |  |  |  |  Erste Spalte des Fensters
rem              |  |  |  |  |  |  |  |  |  |  Erste Zeile des Fensters
rem              |  |  |  |  |  |  |  |  |  |  |  Letzte Spalte des Fensters
rem              |  |  |  |  |  |  |  |  |  |  |  |  Letzte Zeile des Fensters
rem              |  |  |  |  |  |  |  |  |  |  |  |  |  Parameter: 1-Sofortauslösung, 2-Debuginformationen mitloggen. ODER-verknüpfte-Werte werden akzeptiert
rem              |  |  |  |  |  |  |  |  |  |  |  |  |  |  Empfindlichkeit (Pixel) - Geschwindigkeit kontra Präzision (1-verwendet jeden Pixel, 2-verwendet jeden zweiten Pixel, etc.)
rem              |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  Dauer bis zum Auslösen (ms) - kann hilfreich für die Kalibrierung mit der "Zeichne Gitter"-Option sein.
rem              |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
rem              V  V  V  V  V  V  V  V  V  V  V  V  V  V  V  V


@title Bewegungsauslöser
@param a Zeilen Gitter
@default a 4
@param b Spalten Gitter
@default b 6
@param c Gitter zeigen (0=Nein 1=Ja)
@default c 1
@param d Fenster (0=Aus 1=Ein 2=Inv)
@default d 1
@param e Erste Zeile des Fensters
@default e 2
@param f Letzte Zeile des Fensters
@default f 3
@param h Erste Spalte des Fensters
@default h 3
@param i Letzte Spalte des Fensters
@default i 4
@param j Prüfmethode (0-U,1-Y,2-V)
@default j 1
@param k Empfindlichkeit (Pixel)
@default k 6
@param r Lichtschwellwert (0-255)
@default r 10
@param l Vergleichsintervall (ms)
@default l 1
@param m Auslöseverzögerung (0.1s)
@default m 1
@param o Timeout-Periode (s)
@default o 170
@param n Zahl Serienbilder
@default n 5
rem s Wert: D=Direktauslösung, oN=Auslösung ohne Neufokussierung, S=Serienauslösung ohne Neufokussierung
@param s Auslöseart (0=D/1=oN/2=S)
@default s 1
@param u Vor-Fokus (0=Nein 1=Ja)
@default u 1

if c<0 then c=0
if c>1 then c=1

if e>a then e=a
if e<1 then e=1

if f>a then f=a
if f<1 then f=1

if h>b then h=b
if h<1 then h=1

if i>b then i=b
if i<1 then i=1

if s<0 then let s=0
if s>2 then let s=2
get_prop 0 x
if x=18 then let s=3
get_prop 6 y
if s<>2 and y=1 then let s=2
if s=2 and y<>1 then let s=0
if s=0 then let g=1 else let g=0
m=m*100
o=o*1000
print "Beenden: Auslöser drücken"
while 1
   if x<>18 and u<>0 then gosub "fokussieren"
   md_detect_motion b, a, j, o, l, r, c, t, d, h, e, i, f, g, k, m
   if t>0 then print t, " Felder erkannt"
   if t=0 then gosub "wecken"
   if t>0 and u=0 and s=2 then gosub "fokussieren"
   if t>0 and s=1 then click "shoot_full"
   if t>0 and s=2 then gosub "Serienaufnahme"
   if t>0 and s=3 then gosub "Filmaufnahme"
   if t>0 and x<>18 then
      do
         get_prop 205 p
      until p<>1
      let t=0
   endif
wend

:fokussieren
    press "shoot_half"
    do
      get_prop 205 p
    until p=1
return

:Serienaufnahme
      press "shoot_full"
      sleep n*1000
      release "shoot_full"
return

:Filmaufnahme
      click "shoot_full"
      sleep n*1000
      click "shoot_full"
return

:wecken
  release "shoot_half"
  if x<>18 and u=0 then
   click "set"
   click "set"
  endif
return

end


Es sollte so auch unter den guten, alten Allbest-Builds laufen.

Munter bleiben... TRICHTEX
Dateianhänge
Bewegungsaus.bas
Das Script zum Download
(3.8 KiB) 979-mal heruntergeladen
Zuletzt geändert von trichtex am 12.05.2010, 12:10, insgesamt 1-mal geändert.
Powershot A610 100e mit CHDK DE aktuell
trichtex
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 44
Registriert: 20.05.2008, 08:32

Beitragvon msl » 06.05.2010, 14:52

Solltest aber schon dazu schreiben, dass für die DIGIC III/IV die Propcases zu ändern sind. Dafür gibt es normalerweise einen einheitlichen Befehl get_shooting, der natürlich unter allbest nicht zu gebrauchen ist. ;)

Und warum sollen die altbewährten Sachen nicht funktionieren? Schön, dass es noch eine Variante der Bewegungserkennung gibt.

Achso, wer das Skript so kopiert sollte in jedem Fall die erste Leerzeile weglassen und eine Leerzeile ans Skriptende anhängen. Sonst kommt es hundertprozentig zu einer Fehlermeldung. ;)

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: "Nested if" Bug

Beitragvon Caefix » 18.06.2018, 18:03

Man kann if so umgehen:

:##zoom
h=(get_mode=1)
while h
h=0
if R=-1 then click "zoom_in" else click "zoom_out"
R=M
sleep 50
wend
if R=M then return
:)
EsGibtKeinenErdaufgangAufDemMond! SoSimpel...
Benutzeravatar
Caefix
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 78
Registriert: 15.06.2018, 19:14
Kamera(s): Einige!

Re: "Nested if" Bug

Beitragvon msl » 18.06.2018, 21:56

Wo wird hier if umgangen? Was hat das mit dem Thema zu tun?
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: "Nested if" Bug

Beitragvon Caefix » 19.06.2018, 16:44

Sorry,... endif umgehen wäre klarer gewesen.
Code: Alles auswählen
:##zoom
h=(get_mode=1)
while h
...... h=0 !
if R=-1 then click "zoom_in" else click "zoom_out"
R=M
sleep 50
wend
if R=M then return
rem Prinzip: Man ersetzt if- Nester gegen sichere while- Schleifen & schreibt wend für endif.

Hier das doppelt fehlerhafte "Äqivalent":
if h then
if R=-1 then click "zoom_in" else click "zoom_out"
R=M
sleep 50
return !!
endif !!!

gültig wäre auch:
if h then
if R=-1 then click "zoom_in"
if R=-3 then click "zoom_out"
R=M
sleep 50
endif

Immer falsch ist es, per return oder goto aus einer Schleife oder Veriftung  herauszuspringen.
In manchen Lehrbüchern steht sowas zu weit vorne.

Frohes Skripten, Caefix
.
P.S. Aufpoliert für die Vitrine:
----------------------------------
.
:##endif
while no_end_if
.
for x=1 to if_a
......................                            -- for x=1,if_a do -- in Lua
.... for x=1 to if_b
........ for x=1 to if_c-if_e
............ for x=1 to (if_d + if_?) * y...
.             ...
............ next x                             -- end in Lua
............ X=x...
........ next x
.... next x
next x
.
no_end_if = X...
wend                                               -- end in Lua
.
rem & das Thema ist zwischen den Zeilen verschwunden.
return
.

PPS: Die for ... Lösung bietet einen weiteren Bug: Auch ein
for x=1 to 0
print x
next x
end
wird in uBasic einmal durchlaufen.

Dafür sollte sowas funktionieren:

do
x=x+1
rem Gezeter
if x%3 then until get_shooting else until not get_shooting
end
[code]
PPS: Auch "offtopic Bugs" können in einer "Nested if Umgebung" hiermit verwechselt werden...
EsGibtKeinenErdaufgangAufDemMond! SoSimpel...
Benutzeravatar
Caefix
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 78
Registriert: 15.06.2018, 19:14
Kamera(s): Einige!

Vorherige

Zurück zu Code-Ecke

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron