2014-11-16 3 views
0

집계에 하나의 요소 만 포함 된 경우 아래와 같이 위치 지정 표기법으로 인해 컴파일 오류가 발생하며 명명 된 표기법 만 사용해야합니다. 왜? 컴파일러 메시지이 반면한 요소 레코드 집계에 명명 된 연결이 필요한 이유는 무엇입니까?

check.adb:6:23: positional aggregate cannot have one component 
check.adb:6:23: write instead "V => ..." 
gnatmake: “check.adb" compilation error 

type singleton is record 
    v : integer; 
end record; 

v1 : singleton := (0); 

결과는 OK이다 : 식 둥근

v2 : singleton := (v => 0); 
+4

를 사용할 수 있습니다. 이것을 집계 만 될 수있는 (0,0)과 대조하십시오. 이로 인해보다 복잡한 집계, 다중 배열 또는 레코드 배열에서 모호함이 발생할 수 있습니다. –

+3

@BrianDrummond 야, 대답 해, 우리는 그것을 upvote거야! :-) –

답변

5

괄호 중복되도록 (0) = 0가 정수가 아니다 배열 집합체.

따라서 단일 요소 집계의 특별한 경우에는 집계를 간단한 값과 구별하기 위해 명명 된 연관이 필요합니다.

대조적으로 집계 일 수있는 (0,0)과 비교하십시오. 그러므로 애매 모호하지 않습니다.

질문의 맥락에서 의도 된 사람 프로그래머에게는 분명하지만, 항상 그런 것은 아닙니다.

레코드의 한 필드 인 다차원 배열에서 단일 요소 집계를 고려하십시오. 컴파일러가 해결할 수없는 모호함이있을 수 있습니다 (적어도 소스 파일을 더 많이 읽지 않기 전에!) 프로그램을 읽는 사람이라면 누구나 쉽게 사용할 수 있습니다.

0

명명 된 표기법을 사용할 필요가 없습니다.

v1 : singleton := (others => 0); 

이렇게하면 v1의 모든 요소에 0이 할당되고 컴파일러는 번호가 아니라 배열임을 알게됩니다. 레코드가 다른 유형을 가지고 있다면 표현 둥근 괄호는 중복 때문에

그렇게 (0) = 0과는 정수가 아닌 배열 집계입니다,

v1 : singleton := (others => <>); 
+0

[한 필드로 Ada 레코드 만들기] (http://stackoverflow.com/questions/2743099/creating-ada-record-with-one-field) – Jossi