BASCOM--If..Else_Problem

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
GVolt
Użytkownik
Posty: 172
Rejestracja: 06 paź 2005, 17:13
Lokalizacja: z kątowni

BASCOM--If..Else_Problem

Post autor: GVolt » 23 sty 2008, 17:57

Napisałem sobie program z użyciem If..Else. Według mnie niby wszystko dobrze, ale BASCOM wywala mi błędy.

Kod: Zaznacz cały

REM Czemu to nie działa?
Dim Led As Word

Led = Rnd(5)

If Led = 0 Then Goto Led0r
Elseif Led = 1 Then Goto Led1r
Elseif Led = 2 Then Goto Led2r
Elseif Led = 3 Then Goto Led3r
Else Goto Led4r
End If

Led0r:
'cośtam
Led1r:
'cośtam
Led2r:
'cośtam
Led3r:
'cośtam
Led4r:
'blablabla

End
Errors:

Kod: Zaznacz cały

Error : 36 Line: 7  THEN expected , in File : ŚCIEŻKA DO PLIKU BAS
Error : 36 Line: 8  THEN expected , in File :    ------    | |   -------
Próbowałem różnie zmieniać program, ale BASCOM ciągle się do czegoś dopieprza.W błędach zawsze jest tekst o IF THEN lub END IF.

np.:

Kod: Zaznacz cały

Error : 7   Line :   101  IF THEN expected [195] , in File : BLA/BLA/BLA.BAS
Error : 123   Line :  101   END IF expected , in File : BLA/BLA/BLA.BAS
Co robię nie tak? :???:

MiW
Użytkownik
Posty: 226
Rejestracja: 28 sty 2007, 11:32
Lokalizacja: Kraków
Kontakt:

Post autor: MiW » 23 sty 2008, 18:23

zamień goto na gosub

Blabla:
....
return

Jeśli to pomoże, mogę wytłumaczyć Ci dlaczego :)
Dawno nie pisałem w bascomie

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 23 sty 2008, 18:32

GVolt pisze:Elseif Led = 1 Then Goto Led1r
nie może być bez spacji miedzy else a if a tak wogle to kolejne if powinno być w nowej linii... i wogle za dużo razy else... tak ma być:
źle:
GVolt pisze:If Led = 0 Then Goto Led0r
Elseif Led = 1 Then Goto Led1r
Elseif Led = 2 Then Goto Led2r
Elseif Led = 3 Then Goto Led3r
Else Goto Led4r
End If
dobrze:
If Led = 0 Then Goto Led0r
Else
If Led = 1 Then Goto Led1r
If Led = 2 Then Goto Led2r
If Led = 3 Then Goto Led3r
Goto Led4r
End If

znaczy nie do konca ;) bo niektóre polecenia nie mogą być w jednaj linii, ale nie jestem w tym zbyt dobry w każdym razie... tylko zwróć uwage na takie podstawowe błędy
Ostatnio zmieniony 23 sty 2008, 18:38 przez Kulpina, łącznie zmieniany 1 raz.

Awatar użytkownika
RcTomek
Moderator
Posty: 243
Rejestracja: 27 wrz 2007, 21:15
Lokalizacja: Głogów / Wrocław

Post autor: RcTomek » 23 sty 2008, 18:37

Użyj instrukcji Select case.

K_o_n_r_a_d
Użytkownik
Posty: 123
Rejestracja: 29 lip 2005, 10:21
Lokalizacja: Lublin

Post autor: K_o_n_r_a_d » 23 sty 2008, 20:46

Wystarczy powstawiać nowe linie:

Kod: Zaznacz cały

Dim Led As Word

Led = Rnd(5)

If Led = 0 Then
   Goto Led0r
Elseif Led = 1 Then
   Goto Led1r
Elseif Led = 2 Then
   Goto Led2r
Elseif Led = 3 Then
   Goto Led3r
Else
   Goto Led4r
End If

Led0r:
'cośtam
Led1r:
'cośtam
Led2r:
'cośtam
Led3r:
'cośtam
Led4r:
'blablabla

Do:loop
End
GOTO a GOSUB...RETURN mają różne działanie. GOTO tylko przenosi aktualnie wykonywany program w inne miejsce a GOSUB wywołuje podprogram (coś podobnego bardzo do procedury). W tym miejscu uzycie GOSUB zmieniłoby całkowicie działanie programu.

Nie jestem pewien jak Bascom kończy program gdy nie ma pętli głównej dlatego bezpieczniej jest na końcu dać pętlę.

W tym programie faktycznie lepszym rozwiązaniem będzie użycie SELECT CASE:

Kod: Zaznacz cały

Dim Led As Word

Led = Rnd(5)


Select Case Led
   Case 0 : Goto Led0r
   Case 1 : Goto Led1r
   Case 2 : Goto Led2r
   Case 3 : Goto Led3r
   Case Else : Goto Led4r
End Select

Led0r:
'cośtam
Led1r:
'cośtam
Led2r:
'cośtam
Led3r:
'cośtam
Led4r:
'blablabla

Do : Loop
End

Do kolegi Kulpina - zajrzyj do pomocy i poczytaj o konstrukcji IF...
Twoja interpretacja IF... ma troszeczkę inny sens niż IF... ELSEIF...
W Twoim przypadku wszystkie warunki zostaną sprawdzone, oczywiście tylko 1 w danej chwili będzie spełniony w przykładzie z tematu i efekt będzie taki sam, ale nie zawsze tak bywa.
W konstrukcji ...ELSEIF... jesli jeden warunek zostanie spełniony reszta nie jest sprawdzana.

Awatar użytkownika
Tranzystor
Użytkownik
Posty: 889
Rejestracja: 28 sie 2005, 19:19
Lokalizacja: Świętochłowice
Kontakt:

Post autor: Tranzystor » 23 sty 2008, 23:48

Witam,
patrzę na to co napisali koledzy i...

Kod: Zaznacz cały

If warunek Then
'coś tam
Elseif warunek Then
' coś tam
End if
Ma sens do maks. 3 opcji wyboru, powyżej tak jak koledzy podpowiedzieli użyłbym SELECT CASE. Zajmuje to znacznie mniej kodu, a działa raczej tak samo :)

Tak na marginesie...
Twój program nie chciał działać, ponieważ nie umieściłeś "coś tam" pod spodem... Heh, BASCOM strasznie się czepia takich rzeczy. Widzę, że masz przyzwyczajenia z C :) Jest jeden wyjątek, w którym BASCOM się nie przyczepi:

Kod: Zaznacz cały

If warunek Then 'coś tam
Nie musisz stosować wtedy End if :) a raczej nie możesz, tak samo Else. Czasami to poprawia widoczność w okienku programowania :D

Pozdrawiam ;)

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 24 sty 2008, 14:38

K_o_n_r_a_d, hmmm hmmm hmmm nie wiedziałem :mrgreen: nie ma tego w oślej łączce przynajmniej nie tam gdzie jestem ;) człowiek óczy sie na błendah... :mrgreen:

K_o_n_r_a_d
Użytkownik
Posty: 123
Rejestracja: 29 lip 2005, 10:21
Lokalizacja: Lublin

Post autor: K_o_n_r_a_d » 24 sty 2008, 14:48

Dla jasności - oba kody dają identyczny efekt:

Kod: Zaznacz cały

Dim A As Byte

If A > 100 Then
   nop
Elseif A > 80 Then
   nop
Elseif A > 60 Then
   nop
Elseif A > 50 Then
   nop
Else
   nop
End If

end

Kod: Zaznacz cały

Dim A As Byte

If A > 100 Then
   nop
Else
   If A > 80 Then
      nop
   Else
      If A > 60 Then
         nop
      Else
         If A > 50 Then
            nop
         Else
            nop
         End If
      End If
   End If
End If

end
Ale pierwszy jest zdecydowanie bardziej czytelny.

ODPOWIEDZ