Obsługa podprogramów > Sub ... EndSub - struktura

Drukuj

Sub ... EndSub - struktura symp

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:

typ

jest to dowolny typ zmiennej prostej. Typy złożone (tablice, rekordy) mogą być wyłącznie argumentami funkcji wbudowanych (wewnętrznych) języka raportów

nazwa_zm

jest to nazwa zmiennej lokalnej (dostępnej wyłącznie wewnątrz podprogramu), przechowującej wartość przekazaną do podprogramu podczas jego wywołania

 

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