首页 > 解决方案 > 记录数组的数组

问题描述

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

我试过了:

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

标签: arraysrecordada

解决方案


您的问题是这B是一个不受约束的数组:

type B is array (Natural range <>) of C;

这对 来说很好B1 : constant B := (0, 0, 0, 0);,因为常量定义创建了一个新的匿名类型,其范围取自 Right-Hand-Side。

但是,对于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);

推荐阅读