У меня есть ограниченный интерфейс, определенный в my_interface_package.ads.
package My_Interface_Package is
type My_Interface is limited interface;
procedure Procedure_1 (Some_Parameter : in out My_Interface) is null;
procedure Procedure_2 (Some_Parameter_1 : in out My_Interface; Some_Parameter_2 : in String) is abstract;
end My_Interface_Package;
Тип My_Class реализует этот интерфейс (в my_class_package.ads и my_class_package.adb).
with My_Interface_Package;
package My_Class_Package is
type My_Class is limited new My_Interface_Package.My_Interface with record
Some_Element : Boolean;
end record;
overriding procedure Procedure_1 (Some_Parameter : in out My_Class);
overriding procedure Procedure_2 (Some_Parameter_1 : in out My_Class; Some_Parameter_2 : in String);
end My_Class_Package;
with Ada.Text_IO;
package body My_Class_Package is
procedure Procedure_1 (Some_Parameter : in out My_Class) is
begin
Ada.Text_IO.Put_Line("Inside Procedure_1.");
end;
procedure Procedure_2 (Some_Parameter_1 : in out My_Class; Some_Parameter_2 : in String) is
begin
Ada.Text_IO.Put_Line("Inside Procedure_2.");
end;
end My_Class_Package;
У меня есть общий пакет My_Generic_Package, определенный в my_generic_package.ads и my_generic_package.adb. Ожидается тип My_Generic_Type. Я хочу, чтобы этот тип принимал любую конкретную реализацию интерфейса My_Interface.
with My_Interface_Package;
generic
type My_Generic_Type is limited new My_Interface_Package.My_Interface with private; -- The problem seems to be in this declaration.
package My_Generic_Package is
type My_Generic_Class is record
Element : My_Generic_Type;
end record;
procedure Calling_Procedure_1 (Some_Parameter : in out My_Generic_Class);
procedure Calling_Procedure_2 (Some_Parameter_1 : in out My_Generic_Class; Some_Parameter_2 : in String);
end My_Generic_Package;
with Ada.Text_IO;
package body My_Generic_Package is
procedure Calling_Procedure_1 (Some_Parameter : in out My_Generic_Class) is
begin
Ada.Text_IO.Put_Line("Calling Procedure_1.");
Procedure_1(Some_Parameter);
end;
procedure Calling_Procedure_2 (Some_Parameter_1 : in out My_Generic_Class; Some_Parameter_2 : in String) is
begin
Ada.Text_IO.Put_Line("Calling Procedure_2.");
Procedure_2(Some_Parameter_1, Some_Parameter_2);
end;
end My_Generic_Package;
Мой main.adb:
with Ada.Text_IO;
with My_Class_Package;
with My_Generic_Package;
procedure Main is
package My_Instanciated_Package is new My_Generic_Package(My_Generic_Type => My_Class_Package.My_Class);
My_Object : My_Instanciated_Package.My_Generic_Class;
begin
My_Instanciated_Package.Calling_Procedure_1(My_Object);
My_Instanciated_Package.Calling_Procedure_2(My_Object, "some_string");
Ada.Text_IO.Put_Line("Program terminated.");
end Main;
GNAT 12.2.0 говорит мне my_generic_package.ads:3:73: missing ";" (он не хочет «с приватной» частью, но и без нее тоже не получается).
Я пробовал кучу других объявлений, но в конечном итоге (пытаясь вдохновить себя из викиучебников), все потерпели неудачу. Есть идеи, что не так?





У вас есть одна из двух ошибок компилятора. Либо вы разместили неправильный код, и компилятор неправильно помечает эту строку, либо вы разместили правильный код, а компилятор жалуется на неправильную строку. Ваши тела функций в My_Generic_Packge, как указано выше, неверны. Они должны использовать «.Element», добавленный к каждому использованию экземпляров Some_Parameter и Some_Parameter_1.
package body My_Generic_Package is
procedure Calling_Procedure_1 (Some_Parameter : in out My_Generic_Class) is
begin
Ada.Text_IO.Put_Line("Calling Procedure_1.");
Procedure_1(Some_Parameter.Element); -- NOTE CHANGE
end;
procedure Calling_Procedure_2 (Some_Parameter_1 : in out My_Generic_Class; Some_Parameter_2 : in String) is
begin
Ada.Text_IO.Put_Line("Calling Procedure_2.");
Procedure_2(Some_Parameter_1.Element, Some_Parameter_2); -- NOTE CHANGE
end;
end My_Generic_Package;
Полный код, который компилируется онлайн-компилятором jdoodle Ada (GNAT 11):
with Ada.Text_IO; use Ada.Text_IO;
procedure jdoodle is
package My_Interface_Package is
type My_Interface is limited interface;
procedure Procedure_1 (Some_Parameter : in out My_Interface) is null;
procedure Procedure_2 (Some_Parameter_1 : in out My_Interface; Some_Parameter_2 : in String) is abstract;
end My_Interface_Package;
package My_Class_Package is
type My_Class is limited new My_Interface_Package.My_Interface with record
Some_Element : Boolean;
end record;
overriding procedure Procedure_1 (Some_Parameter : in out My_Class);
overriding procedure Procedure_2 (Some_Parameter_1 : in out My_Class; Some_Parameter_2 : in String);
end My_Class_Package;
package body My_Class_Package is
procedure Procedure_1 (Some_Parameter : in out My_Class) is
begin
Ada.Text_IO.Put_Line("Inside Procedure_1.");
end;
procedure Procedure_2 (Some_Parameter_1 : in out My_Class; Some_Parameter_2 : in String) is
begin
Ada.Text_IO.Put_Line("Inside Procedure_2.");
end;
end My_Class_Package;
generic
type My_Generic_Type is limited new My_Interface_Package.My_Interface with private; -- The problem seems to be in this declaration.
package My_Generic_Package is
type My_Generic_Class is record
Element : My_Generic_Type;
end record;
procedure Calling_Procedure_1 (Some_Parameter : in out My_Generic_Class);
procedure Calling_Procedure_2 (Some_Parameter_1 : in out My_Generic_Class; Some_Parameter_2 : in String);
end My_Generic_Package;
package body My_Generic_Package is
procedure Calling_Procedure_1 (Some_Parameter : in out My_Generic_Class) is
begin
Ada.Text_IO.Put_Line("Calling Procedure_1.");
Procedure_1(Some_Parameter.Element);
end;
procedure Calling_Procedure_2 (Some_Parameter_1 : in out My_Generic_Class; Some_Parameter_2 : in String) is
begin
Ada.Text_IO.Put_Line("Calling Procedure_2.");
Procedure_2(Some_Parameter_1.Element, Some_Parameter_2);
end;
end My_Generic_Package;
package My_Instanciated_Package is new My_Generic_Package(My_Generic_Type => My_Class_Package.My_Class);
My_Object : My_Instanciated_Package.My_Generic_Class;
begin
My_Instanciated_Package.Calling_Procedure_1(My_Object);
My_Instanciated_Package.Calling_Procedure_2(My_Object, "some_string");
Ada.Text_IO.Put_Line("Program terminated.");
end jdoodle;
Ссылка: https://www.jdoodle.com/ia/IxJ
Что такое buildgpr?
Спасибо. Кажется, моя проблема связана с
buildgpr, который вызывает/usr/bin/gnatgcc(v10.2.1), хотя я думал, что он использует двоичный файлgccилиgnatmake(v12.2.0), который настроен на моем пути. Мне нужно найти, как изменить это в buildgpr. При составлении под рукой, с вашими исправлениями, работает как положено.