2017-10-31 16 views
1

Adaで同等のJava/Cクラスを作成しようとしています。私が調査したことから、同等のものはタグ付きレコードになります。私は2D配列であるフィールドを作成したいと思っていますが、以下のコードでは以下のエラーが出ます。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

2番目のバージョンが失敗した理由は、

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

別の名前付き型の宣言内に1つの名前付き型を宣言しようとしました。あなたはそれをすることはできません。

また、Adaでは匿名型のレコードフィールドを使用できないため、レコード自体の宣言の前に、レコードのフィールドに必要なすべての型を宣言しておく必要があります。

-32_768 .. 32_767の範囲の値が必要ですか(それはタイプIntegerについてのすべての約束です)。通常、問題の要件に合った型を宣言します。 (問題は密接にCタイプintに一致するようであればもちろん、それから1はInterfaces.C.intを使用する必要があります。)

+0

フィールドとして配列を宣言するにはどうすればいいですか?そして、いいえ、私はおそらくそうではありません - しかし、それは私が私のプログラムをきれいにし始めるときに対処するより小さな問題です。 – HighMans

+0

最後に、2つの整数フィールドと配列フィールドを持つタグ付きレコード( "class")を作成します。 – HighMans

関連する問題