Object Pascal/Podprogramy

Podprogramy

edytuj

W Object Pascalu swoistymi podprogramami są procedury i funkcje. Służą one do zwiększenia czytelności kodu programu jak i również jego przyśpieszenia. Definiuje je się słowami kluczowymi: "procedure" i "function".Procedury definiuje się po zdefiniowaniu modułów, typów i zmiennych (Czyli po instrukcjach uses,type i var(instrukcje type i uses poznacie później)),a przed instrukcjami begin end. Po przeczytaniu tego tematu radził bym przeczytać bardziej zaawansowane informacje o procedurach i funkcjach [[1]]

Procedury

edytuj

Procedury są to kawałki kodu, dzięki którym nie musimy ciągle wpisywać tych samych instrukcji. Wywołujemy je za pomocą tekstu procedure NazwaProcedury(deklaracja typów parametrów);. Oto przykład użycia procedury w prostym programie:

program obliczenia;

procedure Dodawanie(a,b : integer);

var // definicja zmiennej lokalnej (o nich później)
 c : integer;

begin
 c := a + b;//Dodawanie zmiennych a i b i zapisanie wyniku w zmiennej c
 writeln(c);//Wypisanie zmiennej c w okienko konsoli
end;

begin
 Dodawanie(10,30); //Nie trudno się domyślić co się teraz stanie. Program wypisze liczbę 40
end.

Łatwo wyjasnić budowę procedury. Po prostu rozpoczynamy ją słowem procedure, następnie piszemy średnik(;), następnie deklarujemy zmienne, potem wpisujemy begin, wpisujemy instrukcje i kończymy procedurę tekstem end; Ten program jest na tyle prosty że można go napisać bez użycia procedury:

program obliczenia2;

var
 c : integer;

begin
 c := 10 + 30;
 writeln(c);
end.

Program można jeszcze uprościć. Więc pytanie: Po co pisać kilka linijek kodu jeżeli można to samo zrobić pisząc jedną ?? Otóż, ten program jest prostym przykładem. A co jeżeli mamy program który ma 10000 linijek tekstu i popełniliśmy błąd podczas wpisywania sposobu obliczania jakiegoś problemu. Co gorsza ten sposób jest wymieniony w kodzie kilkadziesiąt razy. Musimy teraz szukać wszystkich błędnie napisanych linijek tekstu. Czy nie lepiej użyć procedury lub funkcji która ułatwia nam sprawę o tyle że jeden błąd poprawiamy tylko raz i jest on poprawiony w całym programie? Oczywiście że lepiej.

Funkcje

edytuj

Tutaj mamy program z użyciem funkcji zamiast procedury. Funkcja działa jak zmienna, dlatego przy rozpoczynaniu jej słowem function wybieramy jej typ a na końcu pobieramy jej wartość tekstem wartość:=NazwaFunkcji. Działa on tak samo jak dwa poprzednie.

program obliczenia3;

var
 wynik : integer;

function Dodawanie(a,b : integer) : integer;

begin
 Dodawanie := a + b;//Dodawanie zmiennych a i b i zwrócenie wyniku przez funkcje Dodawanie 
end;

begin
 //Przy okazji pokaże jak można wypisać liczbę zwróconą w funkcji
 //Sposób 1:
 wynik := Dodawanie(10,30);
 writeln(wynik);
 //Sposób 2
 writeln(Dodawanie(10,30))
end.

Program raczej nie potrzebuje wyjaśnienia. Wszystkie 3 programy robią to samo. Ale Procedura Dodawanie(Sposób 2) od razu wypisuje wynik na ekran (tzn. wypisuje podczas jej trwania) więc raczej mniej bezpieczna (Na starych kompilatorach mogą powstać różnego rodzaju błędy) jest jej edycja przed wypisaniem. W przypadku funkcji Dodawanie na wyniku można jeszcze przeprowadzać różne operacje takie jak:

(...)
 wynik := ((Sin(Dodawanie(10,30)) + 10) * 100)/ 523;
(...)

No i to chyba tyle co do wyjaśnienia co to są procedury i funkcje.

Zmienne globalne a lokalne

edytuj

W programie obliczenia wspomniałem o definicji zmiennych lokalnych. Są to zmienne które istnieją podczas trwania procedury/funkcji i nie są dostępne z zewnątrz. Więc kiedy w programie odwołamy się do zmiennej c wtedy kompilator wygeneruje błąd.

program obliczenia;

procedure Dodawanie(a,b : integer);

var
 c : integer;

begin
 c := a + b;
 writeln(c);
end;

begin
 Dodawanie(10,30);
 writeln(c); // Tu nastepuje błąd
end.