Справочное руководство по языку Ада-83



              

Пример настраиваемого пакета


В следующем примере использован настраиваемый пакет для одной из возможных организаций стеков. Размер каждого стека и тип его элементов являются параметрами настройки.

generic SIZE : POSITIVE; type ITEM is private; package STACK is procedure PUSH (E : in ITEM); procedure POP (E : out ITEM); OVERFLOW, UNDERFLOW : exception;end STACK;package body 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; and if; E := SPACE(INDEX); INDEX := INDEX - 1: end POP;end STACK;

Экземпляры настраиваемого пакета могут быть получены так:

package STACK_INT is new STACK(SIZE => 200, ITEM => INTEGER);package STACK_BOOL is new STACK(100, BOOLEAN);

После этого могут быть вызваны процедуры конкретизированных пакетов:

STACK_INT.PUSH(N);STACK_BOOL.PUSH(TRUE);

Возможна другая организация стека (тело пакета опущено):

generic type ITEM is private; package ON_STACKS is type STACK(SIZE : POSITIVE) is limited private; procedure PUSH (S : in out STACK; E : in ITEM); procedure POP (S : in out STACK; E : out ITEM); OVERFLOW, UNDERFLOW : exception; private type TABLE is array (POSITIVE range <>) of ITEM; type STACK(SIZE : POSITIVE) is record SPACE : TABLE(1 .. SIZE); INDEX : NATURAL := 0; end record; end:

При использовании такого пакета сначала должна быть осуществлена конкретизация, после чего можно описать стеки с элементами соответствующего типа:

declare package STACK_REAL is new ON_STACKS(REAL); use STACK_REAL; S : STACK(100); begin ... PUSH(S, 2.54); ... end;









Содержание  Назад