在Ada中,我们可以使用范围获取任何数组的数组切片,包括String.例如:
Name( 1 .. 3 )
Run Code Online (Sandbox Code Playgroud)
我们也可以在for循环中使用一个范围:
for I in 1 .. 10 loop
--do something
end loop;
Run Code Online (Sandbox Code Playgroud)
或者,我们可以按如下方式迭代数组:
for I in X'Range loop
X(I) := Function_Call;
end loop;
Run Code Online (Sandbox Code Playgroud)
所以,我目前的思路是"1 .. 3"形式的范围是Range文字,很像"3"是整数文字,而X'Range是一个返回索引范围的属性.数组X(或类似地,某些有序类型X,例如整数或枚举).
目前,我有一些看起来像这样的代码:
Name( 1 .. 3 )
Run Code Online (Sandbox Code Playgroud)
我一直认为这样的神奇数字不是一个好主意,所以我想我可以定义两个常量:
Name_Prefix_Range_Begin : constant Integer := 1;
Name_Prefix_Range_End : constant Integer := 3;
Run Code Online (Sandbox Code Playgroud)
然后这样做:
Name( Name_Prefix_Range_Begin .. Name_Prefix_Range_End )
Run Code Online (Sandbox Code Playgroud)
但是,如果可以使用Range类型的常量,我觉得它会更清晰,只需编写以下代码来获取我的数组切片:
Name ( Name_Prefix_Range )
Run Code Online (Sandbox Code Playgroud)
那么,最后,在所有这些之后,是否可以声明一个可以存储范围的变量或常量?怎么写的?我已经做出了无法编译的猜测,并且未能找到任何关于这种可能性的参考.
ajb*_*ajb 11
切片和一些其他采用范围的结构也可以采用子类型名称.
subtype Name_Prefix_Range is Integer range 1 .. 3;
Run Code Online (Sandbox Code Playgroud)
然后你可以使用
Name (Name_Prefix_Range)
Run Code Online (Sandbox Code Playgroud)
以及
for I in Name_Prefix_Range loop
...
end loop;
Run Code Online (Sandbox Code Playgroud)
在语言语法中,您可以在任何discrete_range需要的地方使用这样的子类型名称.RM 4.1.2中的切片语法使用它.
请注意,当我说"子类型名称"时,这包括由type声明定义的"类型名称" ; 该名称在技术上是"第一个子类型"的名称.因此,在语法上是合法的
Name (Integer)
Run Code Online (Sandbox Code Playgroud)
但是你会Constraint_Error在运行时得到一个.更合法的是做这样的事情:
for B in Boolean loop ...
for Ch in Character loop ...
Run Code Online (Sandbox Code Playgroud)