Obsługa podprogramów > Sub ... EndSub - struktura | | Drukuj |
Polecenie umożliwia zdefiniowanie podprogramu:
1.Polecenie może zwracać wartość dowolnego typu. Typ zwracanej wartości podaje się bezpośrednio przed poleceniem Sub. Wartość zwracaną ustala się przez podstawienie: nazwa = wartosc_zwracana, gdzie nazwa jest to nazwa podprogramu. Jeśli wartość nie zostanie podstawiona, to podprogram zwróci wartość zero (lub pusty string).
2.Argumentami podprogramów mogą być zmienne proste lub rekordy, nie mogą być argumentami tablice. Wyjątek stanowią funkcje wbudowane do języka (predefiniowane).
3.Wszystkie argumenty typu prostego przekazywane są przez wartość. Oznacza to, że podprogram operuje zawsze na zmiennych utworzonych na czas jego wykonania i zawierających kopię wartości przekazanej przy wywołaniu. W szczególności oznacza to, że zmiana w poprogramie wartości zmiennej będącej argument wywołania nie powoduje jakiejkolwiek zmiany wartości zmiennych spoza podprogramu.
4.Wszystkie argumenty typu Record przekazywane są do podprogramu jako referencje, czyli nie jest tworzona lokalna kopia zmiennej, a wszystkie operacje wewnątrz podprogramu odbywają się bezpośrednio na zmiennej przekazanej do podprogramu podczas jej wywołania.
5.Wszystkie zmienne utworzone wewnątrz podprogramu istnieją tylko w czasie wykonywania podprogramu i nie są dostępne poza podprogramem. Zmienne te mogą mieć identyczne nazwy jak zmienne globalne (utworzone poza podprogramem). W tym wypadku wszystkie odwołania do zmiennej o takiej nazwie odnoszą się do zmiennej w podprogramie. Powyższa uwaga odnosi się także do argumentów podprogramu.
Wykonanie podprogramu może być przerwane w dowolnym momencie przez wykonanie polecenia Exit. Każdy podprogram musi być zdefiniowany przed jego wywołaniem. Możliwe jest umieszczenie treści podprogramu za miejscem jego wywołania, lecz wówczas prototyp podprogramu musi być zadeklarowany (poleceniem Declare) przed jego wywołaniem. W odróżnieniu od podprogramów tworzonych przy użyciu polecenia GoSub, podprogramy zdefiniowane poleceniem Sub mogą być wywoływane rekurencyjnie (przez siebie same) lub rekursywnie (wzajemnie przez inny podprogram). Każde wywołanie (zagłębienie) podprogramu operuje na własnym zestawie zmiennych lokalnych, tak więc każde kolejne zagłębienie nie "widzi" i nie może zmodyfikować zmiennych poprzedniego zagłębienia.
Składnia
Sub nazwa (lista_arg)
blok_polecen
EndSub
Argumenty
Typ |
Nazwa |
Opis |
||||
nazwa |
Nazwa podprogramu. Dowolny ciąg liter, cyfr i znaków podkreślenia (max. 32) zaczynający się od litery. Jest to nazwa identyfikująca podprogram |
|||||
lista_arg |
Lista zmiennych będących argumentami podprogramu. Każdy element listy jest oddzielony od innych elementów przecinkiem i ma postać: typ nazwa_zm gdzie:
|
Wartość zwracana
Może zwracać wartość dowolnego typu prostego, zdefiniowaną w sposób opisany powyżej, jako wynik wykonania podprogramu.
Przykład
//Podprogram zdefiniowany przed wywołaniem
Int Sub Dialog1 (Int czerwony, Int zielony, Int niebieski)
Form "Kolor dialogu nr 1",500,200
Ground czerwony, zielony, niebieski
Button "O&K", 100, 130, 100, 24, -1
Button "&Anuluj", 250, 130, 100, 24, 3
ExecForm
EndSub
//Wywołanie podprogramu zdefiniowanego poprzednio
Dialog1 (255,255,0)
//Deklaracja podprogramu zdefiniowanego dalej
Int Declare Dialog2 ( Int argument )
//Wywołanie podprogramu zdefiniowanego dalej
Dialog2 (0)
//Podprogram zdefiniowany po wywołaniu
Int Sub Dialog2 (Int argument)
Form "Kolor dialogu nr 2",500,200
Ground argument, 255, 255
Button "O&K", 100, 130, 100, 24, -1
Button "&Anuluj", 250, 130, 100, 24, 3
ExecForm
EndSub