Turbo Pascal - Procedury i funkcje
Wszystkie polecenia używane podczas pisania programów (bez dyrektyw i słów kluczowych) są procedurami lub funkcjami. Różnica między procedurą, a funkcją jest taka, że funkcja potrafi zwrócić jakąś wartość. Wszystkie procedury i funkcje zapisane są w modułach. Oczywiście można pisać własne moduły, a tym samym własne procedury (funkcje), czyli polecenia, które będziemy mogli później użyć.
Procedury
Ogólna składnia procedury jest następująca:
PROCEDURE Nazwa_procedury (Parametry); dyrektywa;
blok_danych; {opcjonalnie}
blok_kodu;
Nazwa_procedury jest identyfikatorem, za pomocą którego będziemy się do niej zwracać. Przykładowa procedura czyszcząca ekran może wyglądać tak:
USES CRT;
PROCEDURE Ekran;
BEGIN
CLRSCR;
END;
BEGIN {program główny}
Ekran;
END.
Instrukcja EKRAN znajdująca się w programie głównym spowoduje wywołanie procedury EKRAN, która wyczyści ekran.
Jako parametry możemy podawać różne wartości przyjmowane przez procedurę. Poniżej znajduje się program wykorzystujący procedurę PiszXY, która powoduje wyświetlenie napisu w określonym miejscu.
USES CRT;
PROCEDURE PiszXY(x,y : Word; Napis : STRING);
BEGIN
GotoXY(x,y);
Write(Napis);
END;
BEGIN {program główny}
PiszXY(37,12,'Jak się masz');
END.
Poszczególne parametry oddzielone są od siebie średnikiem. Jeśli w danej procedurze zostaje wywołana ta sama procedura, to nazywamy to rekurencją. Podczas wywoływania procedury rekurencyjnie na stosie zapamiętywany jest aktualny adres oraz wartości wszystkich zmiennych lokalnych, dzięki temu po zakończeniu wykonywania się procedury, następuje powrót do miejsca, z którego wywołanie nastąpiło oraz wszystkie zmienne przywracają swoje pierwotne wartości.
Do dyrektyw zaliczamy:
Dyrektywy NEAR, FAR
Są to odwołania: NEAR (bliskie) i FAR (dalekie). Typ odwołania jest automatycznie określany podczas kompilacji w oparciu o dyrektywę.
Dyrektywa INTERRUPT
Dyrektywa ta umożliwia pisanie procedur obsługi przerwań. Każda procedura obsługi przerwania powinna mieć następującą składnie:
PROCEDURE Nazwa_procedury(Flags, CS, IP, AX, BX, CX,
DX, SI, DI, DS, ES, BP: Word);
INTERRUPT;
blok;
Dyrektywa EXTERNAL
Jeśli mamy już skompilowane przy pomocy asemblera procedury i zapisane w pliku OBJ możemy je przyłączyć do naszego programu używając dyrektywy
{$L PLIK.OBJ}
Jednak dołączone procedury można wykorzystywać tylko, gdy zadeklarujemy je z dyrektywą EXTERNAL.
Dyrektywa ASSEMBLER
Za pomocą dyrektywy ASSEMBLER możemy umieszczać w naszych procedurach wstawki Asemblerowe np.:
PROCEDURE Init13H; Assembler;
ASM;
MOV AH,0H
MOV AL,13H
INT 10H
End;
Dyrektywa INLINE
Pozwala ona na wstawienie kodu programu jako procedury np.
PROCEDURE Resetuj_komputer;
INLINE($EA/$F0/$FF/$00/$F0);
Funkcje
Ogólna składnia funkcji jest następująca:
FUNCTION Nazwa_funkcji (Parametry) : Typ_rezultatu;
dyrektywa;
blok;
Każda funkcja zwraca jakąś wartość. W bloku funkcji musimy więc zamieścić zapis:
Nazwa_funkcji:=coś_tam;
Przykładowa funkcja obliczająca silnię:
FUNCTION Silnia (n : Integer) : Longint;
var i : Integer;
Wynik : Longint;
Begin
Wynik:=1;
For i:=1 to N do Wynik:=Wynik*i;
Silnia:=Wynik;
End;