记录数组

时间:2019-03-28 15:04:01

标签: arrays record ada

我需要创建一个常量记录数组的常量数组,在这里我可以用数字引用外部数组的每个元素。

我尝试过:

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有点陌生,并且已经通过反复试验来学习...)

2 个答案:

答案 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;

这将迫使您的所有B1B2等始终具有四个元素,这是您在示例中已经拥有的元素。

此外,如果您希望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。