Раздел 11.3 - Пример настраиваемого пакета

Давайте рассмотрим пример настраиваемого пакета. Этот пример взят непосредственно из раздела 12.8 Ada 95 RM .

Допустим, что необходимо создать настраиваемый пакет,содержащий операции 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 ?

  1. Size, Positive, Item, и private.
  2. Size и Item.
  3. Size.

Вы можете также:

PREVIOUS Перейти к предыдущему разделу

NEXT     Перейти к следующему разделу

OUTLINE  Вернуться к содержанию Урока 11

David A. Wheeler (dwheeler@ida.org)

Перевод: Юрий Королев   Общая редакция перевода: Г.Ю. Сисюк

Исходная копия этого документа находится по адресу "http://www.adahome.com/Tutorials/Lovelace/s11s3.htm".

Исходная копия перевода размещена на сайте http://www.ada-ru.org