Ошибка компиляции объектно-ориентированного ADA - я не понимаю ошибку - PullRequest
0 голосов
/ 21 апреля 2019

Я надеюсь, что вы можете посоветовать мне. Я пытаюсь использовать объектно-ориентированные функции ADA 95 в первый раз, и я хочу, чтобы два производных класса, циклическая группа и полигруппа, вызывали метод put (), принадлежащий их базовому классу, abstractGroup. Но вместо того, чтобы отслеживать иерархию классов, как я ожидал, компилятор просто говорит мне, что у меня есть несоответствие типов в вызове метода put (). Как мне сказать компилятору распознать связь между объектами?

Вот 5 файлов со всеми посторонними данными и попыткой компиляции:

grpdriver2.adb:

с Ada.Text_IO; использовать Ada.Text_IO; с Ada.Command_Line; использовать Ada.Command_Line;

с группой товаров2; с subgrphandler2;

procedure grpdriver2 is
    cycg:  groupStuff2.cyclicgroup;
    polyg: groupStuff2.polygonGroup;
begin

    cycg := groupstuff2.createCyclicGroup( 10);
    subgrphandler2.put(cycg);   -- line 13

    ------------------------------------------------------------------------------------------------------------------

    polyg := groupstuff2.createPolygonGroup( 10);
    subgrphandler2.put(polyg);     -- line 18

end grpdriver2;

............................................... .................................................. ................

groupstuff2.ads:

с Ada.Text_IO; использовать Ada.Text_IO; с Ada.Command_Line; использовать Ada.Command_Line;

пакет groupstuff2 is

type abstractGroup is tagged record
    x: integer;
end record;


type cyclicGroup is new abstractGroup with record
    y: integer;
end record;


function createCyclicGroup( size: in integer)  return cyclicGroup ;

----------------------------------------

type polygonGroup is new abstractGroup with record
    null;
end record;

function createPolygonGroup( size: in integer) return polygonGroup ;

end groupstuff2;

............................................... ........................................

groupstuff2.adb:

пакет тела groupstuff2 is

procedure put( g: in abstractGroup) is
    x: integer;
begin
    x := 1;
end put;


function createCyclicGroup( size: in integer)  return cyclicGroup is
    cycg: cyclicGroup;
begin
    cycg.x := size;

    return cycg;

end createCyclicGroup;

function createPolygonGroup( size: in integer) return polygonGroup is
    polyg: polygonGroup;
begin
    polyg.x := size;


    return polyg;

end createPolygonGroup;

end groupstuff2;

............................................... ...............................

subgrphandler2.ads:

с Ada.Text_IO; использовать Ada.Text_IO; с Ada.Command_Line; использовать Ada.Command_Line;

с группой товаров2;

пакет subgrphandler2 равен

procedure  put( g: in groupStuff2.abstractGroup);

end subgrphandler2;

............................................... ............................................

subgrphandler2.adb:

тело пакета subgrphandler2 равно

procedure  put( g: in groupStuff2.AbstractGroup) is

begin
        put("THIS IS A PUT STATMENT");      
end put;

end subgrphandler2;

СООТВЕТСТВУЮЩАЯ ПОПЫТКА:

C: \ GNAT \ 2018 \ bin \ ceblang> gnatmake grpdriver2 gcc -c grpdriver2.adb grpdriver2.adb: 13: 36: ожидаемый тип "abstractGroup" определен в groupstuff2.ads:7 grpdriver2.adb: 13: 36: обнаружен тип "cyclicGroup", определенный в groupstuff2.ads:16 grpdriver2.adb: 18: 36: ожидаемый тип "abstractGroup" определен в groupstuff2.ads:7 grpdriver2.adb: 18: 36: обнаружен тип "polygonGroup", определенный в groupstuff2.ads:25 gnatmake: ошибка компиляции "grpdriver2.adb"

1 Ответ

0 голосов
/ 21 апреля 2019

Я не могу скомпилировать код Ada95, так как я использую GNAT CE 2018 (который поддерживает только Ada 2012), но, похоже, вам нужно добавить атрибут Class к типу аргумента put в subgrphandler2 чтобы он принимал тип класса (т. е. groupStuff2.AbstractGroup и все его расширения (унаследованные типы)).

Вы также можете захотеть сделать groupStuff2.AbstractGroup фактически абстрактным, добавив ключевое слово abstract в его определение (см. Ниже).

Этот (переформатированный код) компилируется в GNAT CE 2018 в режиме Ada 2012:

group_driver_2.adb

with Group_Stuff_2; 
with Sub_Group_Handler_2;

procedure Group_Driver_2 is

   Cycg  : Group_Stuff_2.Cyclic_Group;
   Polyg : Group_Stuff_2.Polygon_Group;

begin

   Cycg := Group_Stuff_2.Create_Cyclic_Group (10);
   Sub_Group_Handler_2.Put (Cycg);

   Polyg := Group_Stuff_2.Create_Polygon_Group (10);
   Sub_Group_Handler_2.Put (Polyg);

end Group_Driver_2;

group_stuff_2.ads

package Group_Stuff_2 is

   type Abstract_Group is abstract tagged 
      record
         X: Integer;
      end record;

   --  Cyclic_Group 

   type Cyclic_Group is new Abstract_Group with 
      record
         Y: Integer;
      end record;

   function Create_Cyclic_Group
     (Size: in Integer)  return Cyclic_Group;

   --  Polygon_Group 

   type Polygon_Group is new Abstract_Group with null record;

   function Create_Polygon_Group
     (Size: in Integer) return Polygon_Group ;

end Group_Stuff_2;

group_stuff_2.adb

package body Group_Stuff_2 is

   -------------------------
   -- Create_Cyclic_Group --
   -------------------------

   function Create_Cyclic_Group
     (Size : in Integer) return Cyclic_Group
   is
      Cycg : Cyclic_Group;
   begin
      Cycg.X := Size;
      return Cycg;
   end Create_Cyclic_Group;

   --------------------------
   -- Create_Polygon_Group --
   --------------------------

   function Create_Polygon_Group
     (Size : in Integer) return Polygon_Group 
   is
      Polyg: Polygon_Group;
   begin
      Polyg.X := Size;
      return Polyg;
   end Create_Polygon_Group;

end Group_Stuff_2;

sub_group_handler_2.ads

with Group_Stuff_2;

package Sub_Group_Handler_2 is

   procedure Put (G : in Group_Stuff_2.Abstract_Group'Class);

end Sub_Group_Handler_2;

sub_group_handler_2.adb

with Ada.Text_IO; use Ada.Text_IO;

package body Sub_Group_Handler_2 is

   procedure Put (G: in Group_Stuff_2.Abstract_Group'Class) is
   begin
      Put_Line ("Value of X is" & Integer'Image (G.X));      
   end Put;

end Sub_Group_Handler_2;
...