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

Ogr*_*gre 3 ada

在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)

  • 一个很好的答案,但如果它也直接回答了问题,它会得到改善:不,你不能声明一个可以存储范围的变量或常量.(好吧,你可以定义自己的记录类型,但它不会与`'Range`的语言使用相关联等等.) (2认同)