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

时间:2016-08-26 22:55:32

标签: generics io ada

from itertools import product sorted([(k1, k2, v1+v2) for (k1, v1), (k2, v2) in product(dict1.items(), dict2.items())], \ key = lambda x: x[2], reverse=True) # [('Main', 'Global', 16), # ('Optional', 'Global', 14), # ('Obscure', 'Global', 12), # ('Main', 'Regional', 12), # ('Main', 'Local', 10), # ('Optional', 'Regional', 10), # ('Obscure', 'Regional', 8), # ('Optional', 'Local', 8), # ('Obscure', 'Local', 6)] 中我指定了两个参数(大小和类型)。我想创建一个具有用户在Stack.adb文件中指定的确切数据类型的堆栈。

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

multistack.adb

Stack.adb

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

multistack.adb

因此,正如您可以通过代码告诉我已经为Stack类型创建了数据类型。我还创建了一个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,然后表示User_Stack未定义。

我做了expect valid subtype mark to instantiate "Item"只是为了测试,我可以确认它确实获得了用户指定的数据类型。那么为什么不允许我创建这个包User_Stack?

1 个答案:

答案 0 :(得分:8)

在您的片段中,user_stack_typeobject declaration,但generic instantiation需要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;