Suby to wydzielone procedury do których program może skoczyć i zazwyczaj z nich wraca.
Pierwszy, prosty typ, to taki sub któremu nie przekazuje się żadnych parametrów. Program tam skacze, działa coś na zmiennych programu i kiedy wszystko ma już zrobione i napotyka Return to wraca w miejsce gdzie został wywołany. Sub taki nie wymaga żadnego deklarowania ponieważ, przestarzałym sposobem umieszcza się go już za linią End programu.
Start takiego Suba czyli jego adres określa etykieta z dwukropkiem czyli Label.
Skok do takiego Suba wykonujemy za pomocą polecenia Gosub
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- '-------------------------------------
- Do
- '....
- 'Jeśli wciśnięto przycisk to skocz do Suba
- If Switch = 0 Then Gosub Plus_sub
- '....
- Loop
- End
- '--------------------------------------------------------------------
- Plus_sub: ' <-dwukropek zaraz za etykietą (bez spacji)
- ...coś tu zrób
- Return ' <- taki Sub kończymy Return, a nie End Sub!
Co jeśli chcemy przekazać parametry i do czego się to może przydać.
Subowi możemy przekazać parametry , albo w postaci wartości zmiennej która się Subowi przyda, albo bezpośrednio adres zmiennej którą chcemy w Sub zmienić.
Dla prostego przykładu. Mamy jakąś zmienną i chcielibyśmy ją wysłać do portu COM ale zawsze większą o jeden.
Normalnie musielibyśmy albo stworzyć drugą zmienną, dodać do niej jeden i potem Print
Gdybyśmy chcieli tę zmienną tak wysyłać w kilku miejscach programu to zawsze trzeba by pisać kod dodawający jeden do naszej zmiennej.
Poprzez Sub można to zrobić raz i potem go sobie tylko wywołać.
Tu zaczynają się różnice pomiędzy starszymi wersjami Bascom <2075 a nowszymi.
W starszych wersjach taki Sub trzeba było zadeklarować na początku kodu a Sub umieścić pod linią End
Przykład:
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Dim Zmienna As Byte
- '----
- Declare Sub Zwieksz_i_drukuj(byval Wartosc As byte)
- '------------------------------------------
- Do
- Zmienna = 2
- Zwieksz_i_drukuj Zmienna ' <-jeśli nie ma z przodu Call to nie dajemy nawiasów
- Call Zwieksz_i_drukuj( zmienna ) ' <-jeśli z przodu Call to powinny być nawiasy
- Loop
- '------------------------------------------
- Sub Zwieksz_i_drukuj(byval Wartosc As byte)
- Incr Wartosc ' zwiększ przekazaną wartośc o jeden (2+1)
- Print Wartosc ' i teraz drukuj do portu COM (wyśle 3)
- End Sub '<- taki Sub kończymy przez "End Sub"
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Dim Zmienna As Byte
- '----
- Declare Sub Wyslij()
- '-------------------------------------------
- Do
- Zmienna = 2
- Wyslij ' <-jeśli nie ma z przodu Call to nie dajemy nawiasów
- Call Wyslij() ' <-jeśli z przodu Call to powinny być nawiasy chociażby puste
- Loop
- '-------------------------------------------
- Sub Wyslij()
- Print "Z="; Zmienna ' odpada nam wszędzie dopisywanie "Z="
- End Sub '<- taki Sub kończymy przez "End Sub"
Plusy tego rozwiązania są następujące:
Umieszczamy cały Sub przed głównym kodem gdzie go wywołamy, ale nie musimy go już deklarować
Drugi bonus jest taki, że kiedy nie użyjemy Suba w kodzie to nie zostanie on skompilowany i kod będzie mniejszy
Może się wydać dziwne, po co pisać Sub i go nie używać.
Otóż pozwala to napisać sobie kilka wersji różnych Subów, albo całej biblioteki Subów a na końcu użyć tylko jednego lub kilku.
W ten sposób można do kodu dodawać całe biblioteki swoich ulubionych procedur a używać wybranych.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Config Submode = New
- Dim Zmienna As Byte
- '----
- Sub Zwieksz_o_jeden()
- Incr Zmienna
- End Sub
- '----
- Sub Zwieksz_o_dwa()
- Zmienna = Zmienna + 2
- End Sub
- '-------------------------------------
- Do
- Call Zwieksz_o_dwa()
- 'w tym przykładzie Sub Zwieksz_o_jeden nie zostanie w ogóle skompilowany
- ' --- PONIEWAŻ NIE ZOSTAŁ UŻYTY ---
- Loop
- End