2016-08-26 3 views
2

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 패키지를 만들었습니다. 내가 함께 특정 문제가있어 라인이다 : 그것은 내가 유형으로 user_stack_type을 사용하려고 시도하고있어 사실에 대해 불평

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

. 특정 오류 expect valid subtype mark to instantiate "Item", 다음 User_Stack 정의되지 않았습니다.

테스트하기 위해 put(user_stack_type)을 수행했는데 사용자가 지정한 데이터 유형을 얻었 음을 확인할 수 있습니다. 그렇다면이 패키지 User_Stack을 만들 수없는 이유는 무엇입니까?

+0

도 참조 [* 런타임 *에서 에이다의 제네릭 (http://stackoverflow.com/ q/9630086/230513). – trashgod

답변

5

조각에 user_stack_typeobject declaration이지만 generic instantiationsubtype 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; 
관련 문제