2017-10-31 25 views
1

Ada에서 Java/C 클래스를 만들려고합니다. 내가 조사한 바에 따르면 동등한 것이 Tagged Record가 될 것이다. 아래의 코드를 사용하여 2D Array 필드를 만들고 싶습니다. 다음과 같은 오류가 발생합니다.Ada 태그가 지정된 유형의 2D 배열 필드 만들기

코드 :

package Foo is 
type Bar is tagged 
    record 
     field1 : Integer; 
     field2 : Integer; 
     type field3 is array (1 .. 10, 1 .. 5) of Integer; 
    end record; 
end Foo; 

오류 :

foo.ads:6:25: missing "end record;" for "record" at line 8 

foo.ads:7:17: no "record" for this "end record" 

이 "익명의 배열이 구성 요소로 허용되지 않습니다"라고 나에게 이야기한다.

package Foo is 
type Bar is tagged 
    record 
     field1 : Integer; 
     field2 : Integer; 
     field3 : array (1 .. 10, 1 .. 5) of Integer; 
    end record; 
end Foo; 

답변

4

당신의 두 번째 버전이 실패 이유

field3 : array (1 .. 10, 1 .. 5) of Integer; 

가 새로운 이름이 선언이다 (익명) , (array (1 .. 10, 1 .. 5) of Integer)을 입력하면 타입 선언을 중첩 할 수 없습니다.

응용 프로그램에 따라, 당신은 시도 할 수

type Twod_Array is array (Integer range <>, Integer range <>) of Integer; 
type Bar is tagged 
    record 
     field1 : Integer; 
     field2 : Integer; 
     field3 : Twod_Array (1 .. 10, 1 .. 5); 
    end record; 

또는

type Twod_Array is array (Positive range <>, Positive range <>) of Integer; 
type Bar (First, Second : Natural) is tagged 
    record 
     field1 : Integer; 
     field2 : Integer; 
     field3 : Twod_Array (1 .. First, 1 .. Second); 
    end record; 

[흠. 난 First, Second : Natural 제로 - 길이 배열을 허용했다. 그러나 A_Bar : Bar (0, 10);의 요점은 무엇인지 확실하지 않습니다.]

2

다른 명명 된 형식의 선언 안에 하나의 명명 된 형식을 선언하려고합니다. 너는 그렇게 할 수 없다.

또한 Ada는 익명 형식의 레코드 필드를 허용하지 않으므로 레코드 필드 앞에 필요한 모든 형식을 레코드 자체 앞에 선언했는지 확인해야합니다.

-32_768 .. 32_767 범위의 값이 필요합니까? (이것은 모두 Integer 유형에 대한 Ada의 약속입니다)? 일반적으로 문제의 요구 사항과 일치하는 유형을 선언합니다. (문제가 밀접하게 C 형 int 일치하는 경우 물론, 다음, 하나 Interfaces.C.int를 사용해야합니다.)

+0

배열을 필드로 선언하려면 어떻게해야합니까? 그리고 아니 겠지요.하지만 프로그램을 정리하기 시작할 때 좀 더 작은 문제입니다. – HighMans

+0

결국 2 개의 정수 필드와 배열 필드가있는 태그가 지정된 레코드 ("class")를 만들고 싶습니다. – HighMans