是否可以声明Range类型的变量或常量?

时间:2014-05-14 23:06:51

标签: ada

在Ada中,我们可以使用范围获取任何数组的数组切片,包括String。例如:

Name( 1 .. 3 )

我们也可以在for循环中使用范围:

for I in 1 .. 10 loop
  --do something
end loop;

或者,我们可以按如下方式迭代数组:

for I in X'Range loop
  X(I) := Function_Call;
end loop;

所以,我目前的思路是“1 .. 3”形式的范围是Range文字,很像“3”是整数文字,X'Range是返回范围的属性数组X中的索引(或类似地,某些有序类型X,例如整数或枚举)。

目前,我有一些代码如下:

Name( 1 .. 3 )

我一直认为像这样的神奇数字不是个好主意,所以我想我可以定义两个常数:

Name_Prefix_Range_Begin : constant Integer := 1;
Name_Prefix_Range_End   : constant Integer := 3;

然后执行此操作:

Name( Name_Prefix_Range_Begin .. Name_Prefix_Range_End )

但是,如果可以使用Range类型的常量,我觉得它会更清晰,只需编写以下代码来获取我的数组切片:

Name ( Name_Prefix_Range )

所以,最后,在所有这些之后,是否可以声明一个可以存储范围的变量或常量?怎么写的?我已经做出了无法编译的猜测,并且未能找到任何关于这种可能性的参考。

1 个答案:

答案 0 :(得分:11)

切片和其他一些采用范围的结构也可以采用子类型名称。

subtype Name_Prefix_Range is Integer range 1 .. 3;

然后你可以使用

Name (Name_Prefix_Range)

以及

for I in Name_Prefix_Range loop
    ...
end loop;

在语言语法中,您可以在需要discrete_range的任何地方使用此类型的子类型名称。 RM 4.1.2中的切片语法使用它。

请注意,当我说"子类型名称"时,这包括"类型名称"由type声明定义;这个名字在技术上是第一个子类型"名称。所以说法语合法

Name (Integer)

但是你会在运行时获得Constraint_Error。更合法的是做这样的事情:

for B in Boolean loop ...
for Ch in Character loop ...