如何使用用户输入变量作为通用包的参数?

Jak*_*man 5 generics io ada

Stack.adb我已经指定了两个参数(大小和类型).我想创建一个堆栈,它具有用户在我的multistack.adb文件中指定的确切数据类型.

我似乎无法找到一种方法来创建一个新的包或实例化堆栈与堆栈类型的用户定义的变量.在我继续之前,代码在下面(为了避免代码墙,我已经取出了一些不相关的行):

Stack.adb :

GENERIC
   SIZE : Integer; --size of stack
   TYPE Item IS PRIVATE; --type of stack
Run Code Online (Sandbox Code Playgroud)

multistack.adb :

WITH Ada.Text_Io; USE Ada.Text_Io;
WITH Stack;
PROCEDURE multistack IS
   PACKAGE Iio IS NEW Ada.Text_Io.Integer_Io(Integer); USE Iio;
   Type StackType IS (Int, Str, Char, Day);

   package stack_io is new Ada.Text_IO.Enumeration_IO(StackType); use stack_io;    

    package get_user_specs is
        function makestack return StackType;
    end get_user_specs;

   package body get_user_specs is 
        function makestack return StackType is
            s_type : StackType;
        begin
            put("What is the stack type?"); new_line;
            get(s_type);
            return s_type;
        end makestack;
    begin
        null;
    end get_user_specs;

   user_stack_type : StackType := get_user_specs.makestack;

   PACKAGE User_Stack IS NEW Stack(100, user_stack_type); use User_Stack;

BEGIN
    null;
END Multistack;
Run Code Online (Sandbox Code Playgroud)

因此,正如您可以通过代码告诉我已经为Stack类型创建了数据类型.我还创建了一个Enumeration_IO包,以便能够获得用户输入.我遇到的具体问题是:

   PACKAGE User_Stack IS NEW Stack(100, user_stack_type); use User_Stack;
Run Code Online (Sandbox Code Playgroud)

它抱怨我试图user_stack_type用作类型的事实.具体的错误是expect valid subtype mark to instantiate "Item",然后说User_Stack是未定义的.

我做了一个put(user_stack_type)公正的测试,我可以确认它确实获得了用户指定的数据类型.那么为什么不允许我创建这个包User_Stack?

tra*_*god 8

在您的片段中,user_stack_type是一个对象声明,但通用实例化需要一个子类型标记.获得所需效果的一种方法是,一旦知道所选子类型,就在嵌套范围内实例化泛型:

if User_Stack_Type = Int then 
    declare
        package User_Stack is new Stack(100, Integer);
    begin
        Put_Line(Stack_Type'Image(User_Stack_Type));
        …
    end;
end if;
Run Code Online (Sandbox Code Playgroud)