Ada数组聚合初始化
Ada array aggregate initialization
我正在尝试使用聚合初始化一个简单的 Ada 数组,我希望编译器确定数组边界。但是,在下面尝试使用 Test_2 时,我不能简单地使用整数下标。有没有办法让编译器确定数组边界数组,然后使用简单的 "Test_2(0)" 符号访问它们?
我正在使用 gnat。
谢谢。
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;
如果不指定bounds,数组的下界就是索引类型的下界。 (你可能习惯了像 C 这样的语言,其中数组的下界总是 0
。在 Ada 中不是这样。)
在这种情况下,下界是Integer'First
,可能是-2147483648
。
如果您希望数组范围从 0
开始,您可以使用子类型 Natural
:
type U16_a is array(Natural range <>) of Unsigned_16;
或者您可以使用子类型 Positive
将数组的下限设置为 1
。
您还可以指定每个元素的索引:
Test_2 : U16_a := (0 => 16#8765#, 1 => 16#4321#);
但这可能无法扩展;如果有大量元素,您必须为每个元素指定索引,因为位置关联不能遵循命名关联。
您可以使用数组连接来指定第一个索引,而不是使用位置或命名聚合初始值设定项:
Test_3 : U16_a := (0 => 0) & (1, 2, 3, 4, 5, 6, 7);
参考手册指出:
If the ultimate ancestor of the array type was defined by an
unconstrained_array_definition, then the lower bound of the result is
that of the left operand.
选择具有所需下限的索引子类型更清晰。
我正在尝试使用聚合初始化一个简单的 Ada 数组,我希望编译器确定数组边界。但是,在下面尝试使用 Test_2 时,我不能简单地使用整数下标。有没有办法让编译器确定数组边界数组,然后使用简单的 "Test_2(0)" 符号访问它们?
我正在使用 gnat。
谢谢。
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;
如果不指定bounds,数组的下界就是索引类型的下界。 (你可能习惯了像 C 这样的语言,其中数组的下界总是 0
。在 Ada 中不是这样。)
在这种情况下,下界是Integer'First
,可能是-2147483648
。
如果您希望数组范围从 0
开始,您可以使用子类型 Natural
:
type U16_a is array(Natural range <>) of Unsigned_16;
或者您可以使用子类型 Positive
将数组的下限设置为 1
。
您还可以指定每个元素的索引:
Test_2 : U16_a := (0 => 16#8765#, 1 => 16#4321#);
但这可能无法扩展;如果有大量元素,您必须为每个元素指定索引,因为位置关联不能遵循命名关联。
您可以使用数组连接来指定第一个索引,而不是使用位置或命名聚合初始值设定项:
Test_3 : U16_a := (0 => 0) & (1, 2, 3, 4, 5, 6, 7);
参考手册指出:
If the ultimate ancestor of the array type was defined by an unconstrained_array_definition, then the lower bound of the result is that of the left operand.
选择具有所需下限的索引子类型更清晰。