Ни одна из возможных интерпретаций не соответствует фактическим данным, проблема с кодированием с помощью дженериков в ADA

#generics #ada #put

#дженерики #ada #поместите

Вопрос:

Возникли некоторые проблемы с тем, что код не компилируется из-за инструкций print с помощью put. Опубликует код ниже.

 --  createlis.ads

generic
   size: integer;
   type itemtype is private;
          
package createlis is
           
   procedure addtolist( ad : in itemtype );
       
   procedure printlist;
      
   procedure printlist1(pt: in integer );
       
   procedure deletelist(pt: in integer );
       
   procedure listlength;
          
end createlis;
 
 --  createlis.adb
 
with ada.text_io; use ada.text_io;


package body createlis is
       
       len: integer;
       list: array(1..size) of itemtype;
       
       procedure addtolist( ad : in itemtype ) is 
       begin
          if len < size then
             len := len  1;
             list(len) := ad;
             end if;
       end addtolist;
       
       procedure printlist is 
       begin
          for i in 1..len loop
           put((list(i)));
             put(" , ");
             end loop;
       end printlist;
       
       
       procedure printlist1( pt: in integer ) is 
       begin
          put((list(pt)));
       end printlist1;
       
       
      procedure deletelist( pt: in integer) is
       begin
          for k in pt..(len-1) loop
             list(k) := list(k 1);
                end loop;
                len := len - 1;
       end deletelist;
       
       procedure listlength is
          i : integer;
       begin
          i := 0;
          for x in 1..size loop
             i := i   1;
          end loop;
          put("the array is ");
          put(integer'image(i));
          put(" numbers.");
          
       end listlength;
       
    end createlis;
 
 --  main.adb

with Ada.Text_IO; use Ada.Text_IO;
with createlis; 
procedure main is
    
   package iio is new ada.text_io.integer_io(integer); use iio;
   package iii is new ada.text_io.float_io(float); use iii;
    
   size: integer;
   
begin
    
   put("enter size for option c: ");
   get(size);
    
   declare
              
      package clist is new createlis(size, integer); use clist;
    
   begin
      clist.printlist;
      clist.addtolist(12);
      clist.addtolist(3);
      clist.addtolist(7);
      clist.printlist;
      new_line;
      clist.printlist1(2);
      new_line;
      clist.listlength;
      new_line;
      clist.deletelist(2);
      clist.printlist;
    
   end;
    
   declare
          
      package blist is new createlis(size, float); use blist;
    
   begin
    
      blist.printlist;
      blist.addtolist(12.7);
      blist.addtolist(3.5);
      blist.addtolist(7.6);
      blist.printlist;
      new_line;
      blist.listlength;
      new_line;
      blist.deletelist(2);
      blist.printlist;
   end;

end main;
 

Комментарии:

1. Это хорошая идея — показывать фактические сообщения об ошибках! В контексте еще лучше, попробуйте -gnatl

Ответ №1:

Ada.Text_IO не содержит Put функции ни для Integer , ни для Float . Хотя он содержит универсальные пакеты Integer_IO и Float_IO , вы не можете использовать их напрямую, потому что ваш универсальный пакет может принимать любой тип.

Это означает, что вы должны указать своему универсальному пакету при создании экземпляра, как поместить itemtype , например:

 generic
   size: integer;
   type itemtype is private;
   with procedure Put (Value : itemtype);
package createlis is
-- ...
 

Затем внутри вашего основного вы определяете свои клюшки:

    procedure Put_Integer (Value : Integer) is
   begin
      iio.Put (Value);
   end Put_Integer;

   procedure Put_Float (Value : Float) is
   begin
      iii.Put (Value);
   end Put_Float;
 

И используйте их в экземплярах универсального пакета:

    package clist is new createlis 
     (size, integer, Put_Integer); use clist;
   -- ...
   package blist is new createlis
     (size, float, Put_Float); use blist;
 

Вы не можете напрямую указывать процедуры в iio / iii как общие параметры, поскольку они принимают дополнительные параметры со значениями по умолчанию.