2016-03-04 1 views
1

Я хочу реализовать пример менеджера очереди из «Ada Distilled» (2005), адаптированный для моей работы. Минимальный необходимый код:Пакет с общим помеченным

package1.ads: тело

with Ada.Finalization; 
    use Ada; 


     generic 
      type Element is tagged private; 
     package Lists is 
      use Ada.Finalization; 
      type Item is new Element with private; 
      type Item_Reference is access all Item'Class; 
      type Forward_List is new Controlled with private; 
      function Init return Forward_List; 
      function Is_Empty(Self:Forward_List'Class) return Boolean; 
      procedure Add(Self:in out Forward_List;I:in Item'Class); 

     private 
      type Item is new Element with null record;  
      type Forward_List is new Controlled with 
       record 
       ......... 
       end record; 
      type Forward_List_Reference is access all Forward_List; 
      overriding procedure Initialize(List:in out Forward_List); 
      overriding procedure Finalize(List:in out Forward_List); 
     end Lists; 

Пакет:

package body Lists is 

function Init return Forward_List is 
     FL_new:Forward_List_Reference:=new Forward_List; 
    begin 
     return FL_new.all; 
    end Init; 

    function Is_Empty(Self:Forward_List'Class) return Boolean is 
    begin 
     return Self.Count=0; 
    end Is_Empty; 


    procedure Add(Self:in out Forward_List;I:Item'Class) is 
    begin 
     null; 
    end Add; 

    procedure Finalize(Node:in out Forward_List_Node) is 
    begin 
     null; 
    end Finalize; 

    overriding procedure Initialize (List:in out Forward_List) is 
    begin 
     null; 
    end Initialize; 

    overriding procedure Finalize (List:in out Forward_List) is 
    begin   
     null; 
    end Finalize; 

end Lists; 

Main.adb (с использованием этого пакета):

with Lists; 
with GNAT.Strings; 
with Ada.Finalization;use Ada.Finalization; 
procedure main is 
    use GNAT.Strings; 
    type Temp is new Controlled with 
     record 
     Name:Integer; 
     end record; 
    package Temp_List is new Lists(Temp); 
    FL:Temp_List.Forward_List:=Temp_List.Init; 

    Instance:Temp:=Temp'(Controlled with 
         Name => 60); 
begin 
    Temp_List.Add(Self => FL, 
       I => Instance); 
end main; 

Результат:

Builder results 
E:\ADA\test_containers\20160303\main.adb 
15:11 expected an access type with designated type "Item'class" defined at lists.ads:10, instance at line 9 
found type "Temp" 

Я хотел решить эту проблему всю неделю, прочитать литературу об этом (пакеты, теги с меткой, типы и общие типы) и не могу понять проблему.

Чтобы сделать этот код работать я модифицированный (заменено Item'Class на элементе) спецификация пакета файл: package2.ads:

with Ada.Finalization; 
    use Ada; 

    generic 
     type Element is private; 
    package Lists is 
     use Ada.Finalization; 
     type Forward_List is new Controlled with private; 
     function Init return Forward_List; 
     function Is_Empty(Self:Forward_List'Class) return Boolean; 
     procedure Add(Self:in out Forward_List;I:in Element); 

    private 
     type E_Reference is access all Element; 
     type Forward_List is new Controlled with 
      record 
      ......... 
      end record; 
     type Forward_List_Reference is access all Forward_List; 
     overriding procedure Initialize(List:in out Forward_List); 
     overriding procedure Finalize(List:in out Forward_List); 
    end Lists; 

А потом код "main.adb" начать хорошо.

Итак, это мой вопрос: как я могу работать с первой спецификацией (пример от «Ada Distilled» (package1))?

+1

Я ожидаю, что ошибаюсь, но я не уверен, что этот пример когда-либо был действительно полезным. Не могли бы вы просто использовать «Ada.Containers»? (даже если вы застряли в Ada 2005, вы можете реализовать очередь, используя вектор). –

+0

Simon, спасибо за ответ! Одна из моих задач - создать дерево папок с дисками (с списком acls и другими характеристиками), поэтому я решил создать для него свои собственные контейнеры. Поэтому я сделал это без преобразования типов. И я хочу знать, подходит ли этот пример (package1) или нет. Мне слишком сложно поверить, что этот пример, написанный в книге, неприменим. (извините за мой плохой английский) – George

+0

Я разместил эту проблему на [comp.lang.ada] (https://groups.google.com/forum/?hl=ru-RU/hdKe3oENZNw), и общее мнение заключается в том, что книга неверна. –

ответ

0

Саймон Райт представил ответ в комментариях:

Я отправил эту проблему на comp.lang.ada и общее мнение состоит в том, что книга является неправильной.

Я продолжу свою работу с Элементом в методах (согласно пакету2 в моем вопросе).

 Смежные вопросы

  • Нет связанных вопросов^_^