2017-01-06 9 views
0

내가 현재 ("Ada.Text_IO.Put") 제네릭 형식을 인쇄하려고하지만 항상 같은 오류와 함께 실패합니다 일반 유형을 ada에 인쇄하는 방법은 무엇입니까?

missing argument for parameter "Item" in call to "Put" declared at a-tiinio.ads:60, instance at a-inteio.ads:18 
expected type "Standard.Integer" 
found private type "My_Type" defined at testtype.ads:2 

이러한 오류

은 이해하지만 난 내 값을 인쇄하는 방법을 잘 모릅니다 . 다음 줄은 제 일반적인 유형을 보여줍니다.

generic 
    type My_Type is private; 
    with function "+"(Left: My_Type; Right: My_Type) return My_Type; 

package TestType is 
    ... 
end TestType; 

어떤 도움을 주셔서 감사합니다!

답변

6

당신은 다음과 같은 다른 일반적인 매개 변수를 필요로 할 수 있습니다

with function image(Item : in My_Type) return String; 

그런 다음 단순히 이미지 함수로 문자열 출력을 인쇄 할 수 있습니다.

실제 매개 변수의 예는 다음과 같을 수 있습니다

image => Integer'Image 
2

"는"모든 종류의와 함께 작동하는 일반적인 존재의 점, 그리고 Text_IO의 그것의 서브 프로그램을 호출 할 때 알려진 형식으로 작동되는 , 즉 문자열이라면 어떤 유형의 인쇄에 대해서도 일반적인 것이 필요합니다. 따라서 유형에 따라 String으로 변환되는 특수 함수를 Jim Rogers으로 전달하십시오. 또는 인쇄용으로 My_Type과 함께 일반 공식 패키지를 전달하십시오. 예를 들어.

generic 
    type Any_Type is private; 
package Any_Type_IO is 
    procedure Put (Item : Any_Type); 
    procedure Get (Item : out Any_Type); 
end Any_Type_IO; 

with Any_Type_IO; 
generic 
    type My_Type is private; 
    with function "+"(Left: My_Type; Right: My_Type) return My_Type; 
    with package Printer is new Any_Type_Io (Any_Type => My_Type); 
package TestType is 
    procedure Run_Test; 
end TestType; 

그래서 함께 TestType의 일반적인 실제의 형태가 될 수있는 유형으로, TestType의 일반적인 실제 패키지 될 수있는 패키지가있을 것입니다. 그들은 일치한다. TestType의 인스턴스 내에서 이들을 함께 사용할 수 있습니다. 그것은 일치하는 인쇄 패키지의 작업이며, 또한 에이다 의미에서 일반적인 공식 패키지와 일치해야합니다 : 당신이 그런 Any_Type_IO로 인쇄 패키지를 제공하는 경우

type T is range 1 .. 10; 
package T_IO is new Any_Type_IO (T); 

package My_Test_Instance is new TestType 
    (My_Type => T, 
    "+"  => "+", 
    Printer => T_IO); 

후 인쇄가 모두 감각의 일반적인된다.