Stacks Image 21

Jednostka programowa

Pakiet

W postaci pakietu można zebrać w jednym miejscu procedury i funkcje operujące na danych.

Opis pakietu podzielony jest na dwie części:

  • specyfikacja -- umieszczona w pliku z rozszerzeniem .ads
  • treść -- umieszczona w pliku z rozszerzeniem .adb

W poniższym przykładzie zdefiniowaliśmy pakiet Counter udostępniający procedurę Increment, zwiększającą wartość licznika, i funkcję Get, służącą do odczytywania bieżącej wartości licznika.

package Counter is

procedure Increment;

function Get return Natural;

private

Counter : Natural := 0;

end Counter;


Plik: counter.ads

Specyfikacja pakietu w języku Ada ma postać:

package nazwa is
deklaracje
private
deklaracje
end nazwa;


Po słowie kluczowym private można zamieścić niezbędne deklaracje, które nie powinny być widoczne na zewnątrz pakietu.

Zmienna o identyfikatorze Counter, zdefiniowana w części prywatnej pakietu, może mieć taką samą nazwę jak cały pakiet. Ich rozróżnienie wynika z kontekstu użycia tego identyfikatora.

W naszym przykładzie zadeklarowano procedurę Increment i funkcję Get podając jedynie ich nagłówki. Ich treść znajduje się w pliku zawierającym treść pakietu:

package body Counter is

procedure Increment is
begin
Counter := Counter + 1;
end Increment;

function Get return Natural is
begin
return Counter;
end Get;

end Counter;


Plik: counter.adb

W języku Ada treść pakietu ma postać:

package body nazwa is
treść
end nazwa;


W treści pakietu muszą być podane definicje wszystkich procedur i funkcji jakie zadeklarowano w specyfikacji pakietu.

Treścią procedury Increment jest instrukcja przypisująca zmiennej Counter nową wartość, o jeden większą od poprzedniej.

Do przetestowania pakietu Counter zdefiniowaliśmy procedurę Test_Counter:

with Counter;
with Ada.Text_IO;

procedure Test_Counter is
begin
Ada.Text_IO.Put_Line ("Counter = " & Natural'Image (Counter.Get));
Counter.Increment;
Ada.Text_IO.Put_Line ("Counter = " & Natural'Image (Counter.Get));
Counter.Increment;
Counter.Increment;
Ada.Text_IO.Put_Line ("Counter = " & Natural'Image (Counter.Get));
end Test_Counter;


Plik: test_counter.adb

W powyższej procedurze użyliśmy operatora & do połączenia dwóch łańcuchów znaków. Każdy standardowy typ, w tym użyty przez nas typ Natural składający się z nieujemnych wartości całkowitych, posiada atrybut Image dostarczający łańcuch znaków reprezentujący wartość danego typu.

Kompilacja przykładu:

$ gnatmake test_counter.adb 
gcc -c test_counter.adb
gcc -c counter.adb
gnatbind -x test_counter.ali
gnatlink test_counter.ali


Wynik uruchomienia:

$ ./test_counter 
Counter = 0
Counter = 1
Counter = 3
$


funkcja ← → null