2014-12-03 4 views
1

아래 코드는 내 코드입니다. 컴파일러는 판별자인 var을 사용하여 문자열 name의 크기를 제어 할 수 없습니다.레코드 내에서 레코드의 판별자를 사용할 수 없습니다.

procedure p is 

    type int is range 1 .. 10; 
    type my (var : int) is record 
     name : string (1 .. var); -- this var here is bad, why? 
    end record; 

    hh : my(6); 

begin 
    put (hh.name); 
end p; 

오류 메시지는

p.adb:4:23: expected type "Standard.Integer" 
p.adb:4:23: found type "int" defined at line 2 
+0

'Ada.Strings.Bounded'를 사용하지 않는 이유는 무엇입니까? – trashgod

+3

Gnat를 사용하는 경우 오류 메시지가 무엇이 잘못되었는지를 알려줍니다. 'int'를 새로운 타입 대신에'Integer'의 subtype으로 만들었다면 다른 에러들을 발견 할 수 있습니다. –

답변

3

그것은 에이다 강력한 타이핑 때문이다 있습니다. Ada를 사용하면 서로 호환되지 않는 새로운 정수 및 부동 소수점 유형을 선언 할 수 있습니다. 원래의 의도는 실수로 값이 의미와 완전히 다른 의미를 갖는 것처럼 사용하는 것을 방지하기위한 것이 었습니다.

컴파일러는 "대량"변수가 길이를 가질 수 없기 때문에이 문장을 포착합니다. 모든 것이 단지 Float 또는 Long_Float이라면 컴파일러는 그것을 잡을 수 없을 것입니다.

다른 정수 유형 인 int을 작성하면됩니다. 위의 예에서와 같이 새 유형의 값은 String의 색인 유형인 Integer으로 자동 변환 될 수 없습니다. (String 실제로 array (Positive range <>) of Character with Pack;로 정의되어 있지만, Positive하위 Integer이며, 그들은 같은 기본 유형의 하위 유형이 정말로 때문에 값이 자동으로 PositiveInteger 사이에 변환 할 수 있습니다.)

불행하게도,이 아니다 이 문맥에서 판별자가 혼자 나타나야한다는 Ada 규칙 때문에 허용됨 :

type my(var : int) is record 
    name : string (1 .. Integer(var)); -- this var here is bad why? 
end record; 

따라서 유일한 옵션은 int을 하위 유형으로 지정하는 것입니다.

subtype int is Integer range 0 .. 10; 
type my(var : int) is record 
    name : string (1 .. var); -- this var here is bad why? 
end record; 
관련 문제