W Bascom możemy użyć Subów lub Funkcji.
Podstawowa różnica między nimi jest taka, że funkcja zwraca wartość i dlatego wywołanie funkcji następuje inaczej, poprzez przypisanie wartości zwracanej przez funkcję do jakiejś zmiennej. Zaraz to pokażę na przykładzie.
Kolejną sprawą jest to że Subom i Funkcjom możemy przekazywać parametry, ale nie musimy...
Najprostszy Sub lub Funkcja mogą wyglądać tak:
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Dim A As Byte , B As Byte , C As Byte
- Sub Sumuj()
- C = A + B 'sub działa na zadeklarowanych zmiennych programu
- End Sub
- Function Wynik_sumy() As Byte
- Wynik_sumy = A + B
- End Function
- 'wywołanie dla zwykłego Sub
- Call Sumuj()
- 'wywołanie dla funkcji ->wynik wpisujemy do zmiennej
- C = Wynik_sumy()
Niestety jeśli takie działania chcielibyśmy teraz wykonać dla kolejnych zmiennych D, E i F to musielibyśmy stworzyć kolejny podobny Sub lub Funkcję.
To by było nieekonomiczne i teraz wchodzi właśnie przekazywanie parametrów.
Przekazanie byref czyli "by referece" oznacza przekazanie do Sub`a adresu zmiennych. To pozwoli Subowi czytać bezpośrednio z tych zmiennych oraz zapisywać bezpośrednio do nich.
Należy pamiętać, że do przekazania adresu potrzebne są dwa bajty dla każdej zmiennej , ale używane są tylko chwilowo z zapasu jaki mamy w $swstack.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Dim A As Byte , B As Byte , C As Byte , D As Byte , E As Byte F As Byte
- Sub Sumuj(byref Pierwsza As Byte , Byref Druga As Byte , Byref Trzecia As Byte)
- Trzecia = Pierwsza + Druga
- End Sub
- Call Sumuj(a , B , C) 'sub doda A do B i wynik zapisze w C
- Call Sumuj(d , E , F) 'sub doda D do E i wynik zapisze w F
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Dim A As Byte , B As Byte , C As Byte , D As Byte , E As Byte F As Byte
- Function Wynik_sumy(byref Pierwsza As Byte , Byref Druga As Byte) As Byte
- Wynik_sumy = A + B
- End Function
- C = Wynik_sumy(a , B)
- F = Wynik_sumy(d , E)
Stworzenie kopii oczywiście wymaga czasu. Dodatkowo proszę sobie wyobrazić przekazanie do Suba długiego stringa byval.
Czyli mamy :
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- Dim My_string As String * 100
- Sub Tnij_string(byval Jakis_string)
- End Sub
- Call Tnij_string(my_string) 'spowoduje skopiowanie stringa My_string czyli nawet 100B
Lepiej więc taki długi string przekazać byref i podać tylko adres jego początku dwoma bajtami

Być może ciąg dalszy nastąpi jak przemyślę dalszą część
