在Ada标记类型中创建2D阵列字段

时间:2017-10-31 03:35:09

标签: arrays record ada

我正在尝试在Ada中创建一个等效的Java / C类。根据我的研究 - 相当于标记记录。我想要创建一个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;

2 个答案:

答案 0 :(得分: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);会有什么意义!]

答案 1 :(得分:2)

您尝试在另一个命名类型的声明中声明一个命名类型。你不能这样做。

此外,Ada不允许匿名类型的记录字段,因此您必须确保在声明记录本身之前声明了记录字段所需的所有类型。

您确定需要-32_768 .. 32_767范围内的值(这是Ada对类型Integer的所有承诺)吗?通常会声明一个匹配问题要求的类型。 (当然,如果问题是要密切匹配C类型int,那么应该使用Interfaces.C.int。)