Введение в программирование - Учебное пособие (Корочкин А. В.)

11.5 примеры

D Пример 1:

Настраиваемый   пакет, ресурсами которого являются константы и типы. Такой пакет не требует тела.

generic

N :   integer;

М:   integer;

К:    positive ; package    RUIN     is

Cord :     constant: = N * M ;

type

type

X

Y

Z

end;

Baltic  is ( 1 .. Cord )   of Character;

Belle   is    record

array (1 .. N ) of   Data ;

array (1 .. N , 1 .. M ) of float;

string (1 .. К );

end    RUIN;

Конкретизация пакета    RUIN :

package WAR     is   new  RUIN   (8, 10,14);

package WORD   is    new  RUIN   ( К => Size, M => 10, N = > 99 );

П Пример 2:

Настраиваемый пакет VEC для работы с векторами имеет два фор­мальных параметра настройки - размерность вектора и тип элементов вектора.

Generic

N:     positive;

type     Elem     is    digits    <>; package     VEC     is

type   Vector    is     array   (1. . N)   of    Elem; procedure  Sum_Vec   (VA, VB:    in   Vector;

С :     out    Elem ); - - тело пакета VEC

VC :   out    Vector ); procedure   Mulm_Vec (VA, VB :    in   Vector;

end    VEC;

in     Vector; VC:    out   Vector)     is

package     body     VEC   is procedure      Sum_Vec (VA, VB begin

130

Ада 95. Введение в программирование

Глава 11. Настраиваемые модули

131

 

for    i     in     1   ..   N     loop

VC( i): = VA( i) + VB( i); end    loop; end    Sum_Vec;

procedure    Mulm_Vec (VA,   VB:     in     Vector;

С:    out    Elem)    is Temp :     Elem : =   0.0 ; begin

for   j    in    1   ..   N   loop

Temp : =   Temp   +  VA( j) * VB( j); end    loop; C: =   Temp; end     Mulm_Vec;

end   VEC;

Настраиваемый пакет VEC при конкретизации может настраивать­ся на любую размерность векторов, задаваемую целым положительным числом и на любой тип (подтип), описывающий тип с плавающей точ­кой.

Пример использования и настройки пакета   VEC в процедуре: with   VEC; procedure  Vec_Work    is

type    Floats    is   digits   8; package    DATA   is    new     VEC (80,   Floats); use      DATA; A ,B, С :    Vector; Rez     :     Floats; begin

Sum_Vec( A, B, C);

•    •    •

Mult_Vec (A, B, Rez); end   Vec_Work;

П Пример 3. [12 ]

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; end   if;

E : = Space( Index); Index : = Index -1 ; end   Pop;

133

132

Ада 95. Введение в программирование

end   STACK; Конкретизации    пакета    Stack   :

package     Stack200         is    new   STACK (Size = > 200,

Item = > integer); package    Vector_Stack is    new   STACK ( 55 , Vector) ;

Использование   ресурсов из настроенных пакетов   Vector_Stack   и Stack200 :

Vector_Stack . Рор( X ); Stack200 . Push (16 );

Другая версия пакета для работы со стеком  использует  приватный тип   Stack с дискриминантом :

generic

type   Item   is private; package   ON_STACK    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    On_Stack; Настройка пакета

package    Best_Stack    is    new   On_Stacke (float);

Глава 11. Настраиваемые модули

Pool :  Stack (50); Использование ресурсов :

Best_Stack. Push ( Pool, 3.1426 ); D Пример 4. package   LA   is  - - ненастраиваемый   пакет

type  Gent is private procedure    FA (...) I procedure   FB (... ) ;

end LA;

with LA;   use LA;        - -   настраиваемый пакет   ТОХ generic

type Tender  is new Gent; package  TOX  is

procedure ЁА (X :   in out Tender);

function    ES (Z, Y :       Tender )   return  Tender;

end    TOX;

Настраиваемый пакет ТОХ с формальным производным типом Tender, который может быть только типа Gent или производным о него. Для реализации в теле пакета ТОХ подпрограмм ЕА и ES можно использовать все операции, допустимые для типа Gent , определенные в пакете LA ( процедуры FA и FB).

18 — Корочкин А.  В.

135

Глава 12. Защищенные модули

134

Ада 95. Введение в программирование