首页 文章

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

提问于
浏览
3

在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 回答

  • 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中的切片语法使用它 .

    请注意,当我说"subtype name"时,这包括由 type 声明定义的"type name";该名称在技术上是"first subtype"名称 . 所以说法语合法

    Name (Integer)
    

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

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

相关问题