Допустим, что необходимо создать настраиваемый пакет,содержащий операции Push и Pop для работы со стеком. Ниже приведен один из возможных путей описания такого стека; мы опишем пакет Stack, который будет хранить элементы некоторого типа Item и свой максимальный размер:
generic
Size : Positive;
type Item is private;
package Generic_Stack is
procedure Push(E : in Item);
procedure Pop (E : out Item);
Overflow, Underflow : exception;
end Generic_Stack;
Теперь описанное выше необходимо реализовать, и вот пример такой реализации:
package body Generic_Stack is
type Table is array (Positive range <>) of Item;
Space : Table(1 .. Size);
Index : Natural := 0;
procedure Push(E : in Item) is
begin
if Index >= Size then
raise Overflow;
end if;
Index := Index + 1;
Space(Index) := E;
end Push;
procedure Pop(E : out Item) is
begin
if Index = 0 then
raise Underflow;
end if;
E := Space(Index);
Index := Index - 1;
end Pop;
end Generic_Stack;
Далее пакет Generic_Stack может быть конкретизирован. Если необходимо конкретизировать новый пакет с именем``Stack_Int'', который содержит 200 элементов Integer, то это можно сделать следующим образом:
package Stack_Int is new Generic_Stack(Size => 200, Item => Integer);
``Size =>'' и ``Item =>'' необязательны; их можно опустить, если это необходимо, хотя если этого не делать, код будет понятнее. Теперь запись ("Push") новой величины типа Integer в стек (Stack_Int) можно осуществить следующим образом:
Stack_Int.Push(7);
Что является формальными параметрами для настраиваемого пакета Stack ?
|
|
|
|
|---|
David A. Wheeler (dwheeler@ida.org)
Исходная копия этого документа находится по адресу
"http://www.adahome.com/Tutorials/Lovelace/s11s3.htm".
Исходная копия перевода размещена на сайте http://www.ada-ru.org
Перевод: Юрий Королев
Общая редакция перевода: Г.Ю. Сисюк