Piątek 04 Kwiecień 2025r. Godz 00:00:00      
Postów: 251      

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;