我需要创建一个常量记录数组的常量数组,在这里我可以用数字引用外部数组的每个元素。
我尝试过:
A : constant array (0 .. 3) of B := (B1, B2, B3, B4)
其中B是记录的数组,而B1,B2,B3,B4是类型B的常量数组。
但是当我这样做时,我得到了错误: “数组声明中不受约束的元素类型”
type C is record
a : Integer := 0;
b : Integer := 0;
c : Integer := 0;
d : Integer := 0;
end record;
type B is array (Natural range <>) of C;
B1 : constant B := (0, 0, 0, 0);
B2 : constant B := (2, 0, 2, 0);
B3 : constant B := (0, 1, 0, 1);
B4 : constant B := (2, 1, 2, 1);
A : constant array (0 .. 3) of B := (B1, B2, B3, B4);
我希望使用A能够像这样数字地引用B1,B2,B3,B4:
A(1)返回B1
A(2)返回B2
以此类推...
(如果我使用的术语有误,我深表歉意。我对Ada有点陌生,并且已经通过反复试验来学习...)
答案 0 :(得分:2)
您的问题是B
是不受约束的数组:
type B is array (Natural range <>) of C;
这对于B1 : constant B := (0, 0, 0, 0);
很好,因为常量定义会创建一个新的匿名类型,其范围取自右侧。
但是,A
不合适。编译器需要知道数组元素的大小,但是当该元素(在这种情况下为B
)不受约束时,就不需要知道。此外,所有元素的约束('First
,'Last
等)必须相同。
您可以将B
的定义更改为受约束:
type B is array (Natural range 1..4) of C;
这将迫使您的所有B1
,B2
等始终具有四个元素,这是您在示例中已经拥有的元素。
此外,如果您希望A(1)
返回B1
,则应将A
的范围更改为从1开始:
A : constant array (1 .. 4) of B := (B1, B2, B3, B4);
答案 1 :(得分:2)
对您来说显而易见的事情对编译器而言并不明显,那就是您的所有B都有四个元素。
要访问元素A(3)(2),它(或Ada语言)希望能够进行非常简单的算术(2 + 3 * 4)*(整数大小)。 B数组(不受约束)会使此计算过于复杂。产生的机器代码将需要添加A(0),A(1),A(2)的大小,才能得出A(3)(0)。 当然,您可以想象要花大得多的数组长度会花费的时间,例如仅用于访问元素A(1234)(5678)。
这就是为什么Ada的设计师明智地要求始终具有约束类型的数组的原因。对于您的问题,可以通过定义subtype BL4 is B (0 .. 3);
来解决它,并为B1,B2,B3,B4和A使用BL4而不是B。