Ada数组聚合初始化

Ada数组聚合初始化,ada,Ada,我正在尝试使用聚合初始化一个简单的Ada数组,我希望编译器确定数组边界。然而,当尝试使用下面的Test_2时,我不能简单地使用整数下标。有没有一种方法可以让编译器确定数组边界数组,并使用简单的Test_20表示法访问它们 我在用蚊虫 谢谢 with Interfaces; use Interfaces; procedure Test_Init is type U16_a is array(Integer range <>) of Unsig

我正在尝试使用聚合初始化一个简单的Ada数组,我希望编译器确定数组边界。然而,当尝试使用下面的Test_2时,我不能简单地使用整数下标。有没有一种方法可以让编译器确定数组边界数组,并使用简单的Test_20表示法访问它们

我在用蚊虫

谢谢

with Interfaces;                   use Interfaces;

procedure Test_Init is
   type U16_a is array(Integer range <>) of Unsigned_16;

   -- array aggregate initialization
   Test_1 : U16_a(0..1) := (16#1234#, 16#5678#); -- ok, but...
   Test_2 : U16_a       := (16#8765#, 16#4321#); -- let compiler create bounds

   Test_3 : Unsigned_16;
begin

    -- Test_1 obviously works
    Test_3 := Test_1(0);

    -- warning: value not in range of subtype of "Standard.Integer" defined at line 8
    -- This produces a constraint.
    -- What is the subtype that is defined at line 8?  It is not Integer (0..1)
    Test_3 := Test_2(0);

    -- this works though
    Test_3 := Test_2(Test_2'First);

    -- and this works
    Test_3 := Test_2(Test_2'Last);

    -- and this works
    Test_3 := Test_2(Test_2'First + 1);

end Test_Init;

如果不指定边界,数组的下界就是索引类型的下界。您可能已经习惯了C这样的语言,其中数组的下限始终为0。Ada不是这样的

在本例中,下界是Integer'First,可能是-2147483648

如果希望数组边界从0开始,可以使用子类型Natural:

但这可能不会扩大规模;如果有大量元素,则必须为每个元素指定索引,因为位置关联不能跟随命名关联

您可以使用数组连接来指定第一个索引,而不是使用位置或命名聚合初始值设定项:

Test_3 : U16_a := (0 => 0) & (1, 2, 3, 4, 5, 6, 7);
参考手册规定:

如果数组类型的最终祖先是由 无约束数组定义,则结果的下界为 左操作数的


选择具有所需下限的索引子类型更为简洁。

如果不指定边界,数组的下限就是索引类型的下限。您可能已经习惯了C这样的语言,其中数组的下限始终为0。Ada不是这样的

在本例中,下界是Integer'First,可能是-2147483648

如果希望数组边界从0开始,可以使用子类型Natural:

但这可能不会扩大规模;如果有大量元素,则必须为每个元素指定索引,因为位置关联不能跟随命名关联

您可以使用数组连接来指定第一个索引,而不是使用位置或命名聚合初始值设定项:

Test_3 : U16_a := (0 => 0) & (1, 2, 3, 4, 5, 6, 7);
参考手册规定:

如果数组类型的最终祖先是由 无约束数组定义,则结果的下界为 左操作数的


选择具有所需下限的索引子类型更简洁。

或在聚合中指定边界,如:Test_2:U16_a:=0=>168765,1=>164321@艾吉尔:是的,但这并不能很好地扩展。如果有大量的元素,则必须为每个元素指定索引,因为位置关联不能跟在命名关联之后。当然,但是您可能会从文件中读取数组元素anyway@egilhh:有一种方法可以指定第一个索引查看我的更新答案,但它很难看。谢谢Keith,你搞定了。是的,我在想C和写Ada。有时很难驱除这些恶魔,或者在集合中指定边界,比如:Test_2:U16_a:=0=>168765,1=>164321@艾吉尔:是的,但这并不能很好地扩展。如果有大量的元素,则必须为每个元素指定索引,因为位置关联不能跟在命名关联之后。当然,但是您可能会从文件中读取数组元素anyway@egilhh:有一种方法可以指定第一个索引查看我的更新答案,但它很难看。谢谢Keith,你搞定了。是的,我在想C和写Ada。有时很难驱除那些恶魔。
Test_3 : U16_a := (0 => 0) & (1, 2, 3, 4, 5, 6, 7);