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