Generics Ada…程序无法从主菜单中看到

Generics Ada…程序无法从主菜单中看到,generics,ada,Generics,Ada,我刚开始学习Ada,我很难理解它 我有main.adb、createlist.adb和createlist.ads(要遵循的代码) 我发现了错误 “打印列表”不可见(后面有更多参考) createlist.ads处的不可见声明:(无论行号如何) 对于每个过程和功能 我在main中尝试了它,它在那里工作,所以我已经知道当程序可见时,它们应该做什么。我只是不知道我做错了什么让他们看不见。我已经在课堂笔记、谷歌、github、这里和其他各种论坛上找到了答案,但还没有找到解决方案 main.adb wi

我刚开始学习Ada,我很难理解它

我有main.adb、createlist.adb和createlist.ads(要遵循的代码)

我发现了错误

“打印列表”不可见(后面有更多参考)

createlist.ads处的不可见声明:(无论行号如何)

对于每个过程和功能

我在main中尝试了它,它在那里工作,所以我已经知道当程序可见时,它们应该做什么。我只是不知道我做错了什么让他们看不见。我已经在课堂笔记、谷歌、github、这里和其他各种论坛上找到了答案,但还没有找到解决方案

main.adb

with Ada.Text_IO;
use Ada.Text_IO;
with Ada.Float_Text_IO;
use Ada.Float_Text_IO;
with CreateList;



procedure Main is

   max: integer;
   pointer: integer;
   len: integer;

   package IntIO is new Ada.Text_IO.Integer_IO(Integer); use IntIO;

begin

   Put("What size is the array? ");
   get(max);

      declare

      list: array (1 .. max) of Integer;

   begin
      list := (others => 0);
      pointer := 0;
      len := 0;

      print_list;
      add_to_list(12);
      add_to_list(3);
      add_to_list(7);
      print_list;
      len := length_of_list;
      for pointer in 1 .. len loop
         print_list;
      end loop;
      Put_Line("");
      delete_from_list(2);
      print_list;
   end;

end Main;
createlist.adb

with Ada.Text_IO;
use Ada.Text_IO;
with Ada.Float_Text_IO;
use Ada.Float_Text_IO;

package body CreateList is -- in file CreateList.adb
   len: Integer;
   list: array(1..max) of itemType;

   procedure add_to_list (ListItem: in itemType) is begin
      if pnt >= max then
            Put_Line("**Detected Overflow**");
         else
            pnt := pnt + 1;
            list(pnt) := ListItem;
         end if;
      null;
   end add_to_list;

   procedure delete_from_list (indx: in Integer) is begin
      if indx = 0 then
            Put_Line("**Detected Underflow**");
      else
         for j in indx .. (pnt - 1) loop
            if j < len then
               list(j) := list(j + 1);
            end if;
         end loop;

         pnt := pnt - 1;
      end if;
      null;
   end delete_from_list;

   function length_of_list return Integer is begin
      return len;
   end length_of_list;

   procedure print_list (indx: in Integer) is begin
      Put(list(indx));
      Put(" ");
      null;
   end print_list;

   procedure print_list is begin
      for i in 1 .. max loop
         Put(list(i));
         Put(" ");
      end loop;
      Put_Line("");
      null;
   end print_list;

end CreateList;
我传递指针时也有困难


感谢您的帮助。

了解可见性是理解Ada的关键。正如错误消息所说,在主过程中看不到任何名为Print_List的内容。如果Createlist是一个包,则可以调用程序Print_List,该程序声明为
Createlist.Print_List
但是Createlist不是一个pkg,它是一个泛型pkg,所以只能通过泛型实例化的过程来创建pkg:
包实例化\u Name是新的Createlist(Max=>42,Itemtype=>where)如果您已经这样做了,那么您可以调用
实例化\u Name.Print\u List
或实例化了泛型包后,您可以
使用实例化\u名称和程序将可见。如果为不同的类型实例化两次,其中大多数将显示,并按其参数类型正确解析,但无参数
printlist
不会显示。这很好:它让你使用
实例化\u Name.printlist
来打印正确的列表。实例化得到了它。多谢各位much@JesseSchultz:请回答您的问题以显示您修改过的方法,或者您可以。理解可见性是理解Ada的关键。正如错误消息所说,在主过程中看不到任何名为Print_List的内容。如果Createlist是一个包,则可以调用程序Print_List,该程序声明为
Createlist.Print_List
但是Createlist不是一个pkg,它是一个泛型pkg,所以只能通过泛型实例化的过程来创建pkg:
包实例化\u Name是新的Createlist(Max=>42,Itemtype=>where)如果您已经这样做了,那么您可以调用
实例化\u Name.Print\u List
或实例化了泛型包后,您可以
使用实例化\u名称和程序将可见。如果为不同的类型实例化两次,其中大多数将显示,并按其参数类型正确解析,但无参数
printlist
不会显示。这很好:它让你使用
实例化\u Name.printlist
来打印正确的列表。实例化得到了它。多谢各位much@JesseSchultz:请回答您的问题以显示您修改的方法,或者您可以。
generic
   max: integer;
   type itemType is private;

package CreateList is
      
   procedure add_to_list (listItem: in itemType);
   --   
   procedure delete_from_list (indx: in itemType);
   --   
   function length_of_list return itemType;
   --
   procedure print_list (indx: in itemType);
   procedure print_list;

end CreateList;