2010-04-30 4 views
6

하나 개의 필드와 에이다 레코드 만들기 : 나는 기록의 인스턴스를 반환하는 함수를 만들내가 유형을 정의했습니다

type Foo is record 
    bar : Positive; 
end record; 

을 :

function get_foo return Foo is 
    return (1); 
end get_foo; 

하지만 에이다 못하게 나, "위치 집계는 하나의 인수를 가질 수 없다"고 말했습니다.
어리석은 노력으로 레코드에 또 다른 바보 필드를 추가 한 다음 return (1, DOESNT_MATTER);이 작동합니다!

Ada에게 위치 집계가 아니라 레코드 만들기 시도를 어떻게 말합니까?

+5

FYI : 제 경험상 대부분의 "Ada haters"는 Ada에서 다른 언어를 코딩하려고하기 때문에 좌절감을 느낍니다. Ada를 실제로 배우는 법을 배우면, 아주 좋은 언어입니다. 대부분보다 낫다. 그러나, 그것은 믿을 수 없을만큼 엉뚱한 C 컴파일러를 만든다. –

+0

예를 들어, 당신은 정말로 * 당신의 타입을 생각해야합니다. 위의 막대에 0을 넣으려고하는 경우가있는 경우, 상수 인'constraint_error'로 정말 좌절하게 될 것입니다. –

+0

Ada에 낙관적으로 접근 한 사람으로서, 다른 언어와 달리 Ada는 "Ada의 방법"을 배우기가 좌절감을 느끼기 때문에 좌절했습니다. :) 저는 Ada에 대한 아이디어가 마음에 들지만 구현이 복잡하고 실망 스럽다는 것을 알고 있습니다. 나는 성격에 공감한다. : p – weberc2

답변

7

위치 집계 초기화는 하나의 구성 요소 만있는 레코드에는 사용할 수 없지만 하나의 구성 요소로 레코드 할 수 없다는 것을 의미하지는 않습니다.

레코드 유형의 값은 명명 된 필드 목록을 제공하여 지정됩니다. get_foo 함수의 올바른 코드는 다음과 같아야합니다.

function get_foo return Foo is 
    return (bar => 1); 
end get_foo; 

Foo'(bar => 1) 표현식을 사용하여 레코드 유형을 지정할 수도 있습니다.

명명 된 구성 요소 목록을 사용하는 것이 실제로 위치 지정보다 더 좋습니다. 구성 요소의 위치를 ​​잊어 버릴 수 있으며 레코드에 새 필드를 추가해도 변경되지 않습니다.

+0

고마워요! 너 내가 나를 조금이라도 싫어하게 만들었 어! :) –

+0

그건 속임수 야. –

관련 문제