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

How to use user input variable as parameter for generic package?

Stack.adb 中,我指定了两个参数(大小和类型)。我想创建一个与用户在我的 multistack.adb 文件中指定的数据类型完全相同的堆栈。

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

Stack.adb :

GENERIC
   SIZE : Integer; --size of stack
   TYPE Item IS PRIVATE; --type of stack

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;

所以,正如您从代码中看到的那样,我已经为堆栈类型创建了数据类型。我还创建了一个 Enumeration_IO 包来获取用户输入。我遇到具体问题的行是:

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

它抱怨我试图使用 user_stack_type 作为类型。具体错误是expect valid subtype mark to instantiate "Item",然后说User_Stack is undefined.

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

在您的片段中,user_stack_type 是一个 object declaration, but a generic instantiation requires a subtype mark。获得预期效果的一种方法是在已知所选子类型后在嵌套范围内实例化泛型:

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;