ПРИМЕЧАНИЕ
Пометку in разрешается не указывать (она подразумевается по умолчанию), поэтому в спецификации функции вид параметра отсутствует. Для формального параметра вида in разрешается задавать начальное значение, присваиваемое по умолчанию.
Пример спецификации:
procedure Sum ( Opl : in Integer := 0; Op2 : in Integer := 0;
Op3 : in Integer := 0: Res : out Integer );
Тело процедуры в общем случае имеет вид
procedure <ИмяПроцедуры>
(<СписокФормальныхПараметров>) is
<объявления локальных переменных и констант>
begin
<операторы>
end <ИмяПроцедуры>;
Пример тела:
procedure Sum ( Opl : in Integer := 0; Op2 : in Integer := 0;
Op3 : in Integer := 0: Res : out Integer ) is
begin
Res := Opl + Op2;
Res := Res + Op3;
end Sum;
В данной процедуре три формальных параметра имеют значения по умолчанию. Это дает интересные возможности.
Обращаются к процедуре с помощью оператора вызова, он имеет вид
<ИмяПроцедуры> (<СписокФактическихПараметров>);
Примеры операторов вызова:
Sum (4. 8, 12. d); -- переменная d получит значение 24
Sum (4. 8. Res => d); -- переменная d получит значение 12
ПРИМЕЧАНИЕ
В первом операторе вызова задано 4 фактических параметра, во втором операторе — 3 фактических параметра. Во втором операторе использованы как традиционная (позиционная) схема, так и именная схема сопоставления формального и фактического параметров.
Пакеты
Пакет — основное средство для поддержки многократности использования программного текста. При проектировании программ пакеты позволяют применить подход клиент-сервер. Пакет действует как сервер, который предоставляет своим клиентам (программам и другим пакетам) набор услуг.
Спецификация пакета объявляет предлагаемые услуги, а тело содержит реализацию этих услуг.
Спецификация пакета записывается в виде
package <ИмяПакета> is
<объявления типов, переменных, констант>
<спецификации процедур и функций>
end <ИмяПакета>;
Пример спецификации:
package Рисование is
type Точка is array ( 1 .. 2 ) of Integer;
-- описание точки в прямоугольной системе координат
procedure Переход ( из : in Точка; в : in Точка );
-- переход из одной точки в другую точку
procedure Рисовать_Линию (от : in Точка; до : in Точка );
-- рисуется сплошная линия между заданными точками
procedure Рисовать_Пунктирную_Линию (от : in Точка: до ; in Точка );
-- рисуется пунктирная линия
end Рисование;
Данная спецификация предлагает клиентам один тип данных и три процедуры.
Тело пакета представляется в виде
package body <ИмяПакета> is
<объявления локальных переменных, констант. типов>
<тела процедур и функций>
end <ИмяПакета>;
Еще раз отметим, что содержание тела пакета клиентам недоступно.
Пример тела:
package body Рисование is
-- локальные объявления
procedure Переход ( из : in Точка: в : in Точка ) is
-- локальные объявления
begin
-- операторы
end Переход;
procedure Рисовать_Линию(от : in Точка: до ; in Точка) is
-- локальные объявления
begin
-- операторы
end Рисовать_Линию;
procedure Рисовать_Пунктирную_Линию ( от : in Точка;
до : in Точка ) is
-- локальные объявления
begin
-- операторы
end Рисовать_Пунктирную_Линию; in Точка;
до : in Точка ) is
-- локальные объявления
begin
-- операторы
end Рисовать_Пунктирную_Линию;
end Рисование:
В спецификации пакета может быть полузакрытая (приватная) часть. Эта часть отделяется от обычной (открытой) части служебным словом private. Содержимое приватной части пользователю (клиенту) недоступно. В эту часть помещают скрываемые от пользователя операции и детали описания типов данных. Заметим, что из тела пакета доступно содержание как открытой, так и приватной части спецификации.