Я хочу реализовать пример менеджера очереди из «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))?
Я ожидаю, что ошибаюсь, но я не уверен, что этот пример когда-либо был действительно полезным. Не могли бы вы просто использовать «Ada.Containers»? (даже если вы застряли в Ada 2005, вы можете реализовать очередь, используя вектор). –
Simon, спасибо за ответ! Одна из моих задач - создать дерево папок с дисками (с списком acls и другими характеристиками), поэтому я решил создать для него свои собственные контейнеры. Поэтому я сделал это без преобразования типов. И я хочу знать, подходит ли этот пример (package1) или нет. Мне слишком сложно поверить, что этот пример, написанный в книге, неприменим. (извините за мой плохой английский) – George
Я разместил эту проблему на [comp.lang.ada] (https://groups.google.com/forum/?hl=ru-RU/hdKe3oENZNw), и общее мнение заключается в том, что книга неверна. –