代码之家  ›  专栏  ›  技术社区  ›  CaesiumWhale

在Ada标记类型中创建2D数组字段

  •  1
  • CaesiumWhale  · 技术社区  · 7 年前

    我试图在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 回复  |  直到 7 年前
        1
  •  4
  •   Simon Wright    7 年前

    第二个版本失败的原因是

    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
  •  2
  •   Jacob Sparre Andersen    7 年前

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

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

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