Ada 如何更改范围类型的范围?

Ada 如何更改范围类型的范围?,ada,Ada,假设我有 function x return boolean is type range0 is range 1..1; begin canse x is when 4=> range0:=firstArray'range; when 5=> range0:=secondArray'range; when 6=> range0:=1..100;

假设我有

    function x return boolean is 
          type range0 is range 1..1; 
        begin 
         canse x is 
          when 4=> range0:=firstArray'range; 
          when 5=> range0:=secondArray'range; 
          when 6=> range0:=1..100;
        end case;
    end x;

基本上我想在移动中更改0的范围?在不使用declare块的情况下,我如何实现这一点?

基本上,我想随时更改range0的范围?我如何在不使用declare块的情况下实现这一点

嗯。。。 在Ada 2012中,您可以使用if和case表达式,因此您可以使用如下内容:

Type数组\u Type是整数的数组(正范围);
数组_1:数组_类型(1..128);
数组_2:数组_类型(33..63);
--您的变体选择器
使用_1:常量布尔:=True;
--您的变体范围如下:
子类型变量范围为正范围
(如果使用_1,则首先使用数组_1',否则首先使用数组_2')
..(如果使用_1,则数组_1'Last,否则数组_2'Last);
数组_3:数组_类型(变量_范围);

尽管如此,这可能不是最好的方法,使用declare块很可能会更容易维护。

基本上,我想随时更改range0的范围?我如何在不使用declare块的情况下实现这一点

嗯。。。 在Ada 2012中,您可以使用if和case表达式,因此您可以使用如下内容:

Type数组\u Type是整数的数组(正范围);
数组_1:数组_类型(1..128);
数组_2:数组_类型(33..63);
--您的变体选择器
使用_1:常量布尔:=True;
--您的变体范围如下:
子类型变量范围为正范围
(如果使用_1,则首先使用数组_1',否则首先使用数组_2')
..(如果使用_1,则数组_1'Last,否则数组_2'Last);
数组_3:数组_类型(变量_范围);

综上所述,这可能不是最好的方法,使用declare块很可能更容易维护。

Ada 2012的另一个非declare块答案:

最小值:整数:=Integer'First;--'所以突出校正
最大值:整数:=整数'Last;--'*同样的*
_范围(X:Integer)中的函数返回布尔值为
(X范围内最小值..最大值);
子类型变量\u范围是整数范围整数
动态_谓词=>在_范围内(变量_范围);

警告:虽然这应该有效,但我尚未测试它。

Ada 2012的另一个非声明块答案:

最小值:整数:=Integer'First;--'所以突出校正
最大值:整数:=整数'Last;--'*同样的*
_范围(X:Integer)中的函数返回布尔值为
(X范围内最小值..最大值);
子类型变量\u范围是整数范围整数
动态_谓词=>在_范围内(变量_范围);

警告:虽然这应该可以工作,但我还没有对其进行测试。

通过将显而易见的方式(声明块)转换为本地过程,您可以在技术上满足规定的要求:

function x return boolean is 

   procedure use_dynamic_range(first,last : in integer) is
      type range0 is new integer range first .. last;
   begin
      null;
   end use_dynamic_range;

begin 
   case z is 
      when 4=> use_dynamic_range(firstArray'first, firstArray'last); 
      when 5=> use_dynamic_range(secondArray'first, secondArray'last); 
      when 6=> use_dynamic_range(1,100); 
   end case;
end x;

因为它是一个本地过程,它在与等效的declare块相同的范围内执行,因此它可以访问X中所有可见的内容,因此您不需要向它传递大量的参数列表。

通过将显式方式(declare块)转换为本地过程,您可以在技术上满足所述的要求:

function x return boolean is 

   procedure use_dynamic_range(first,last : in integer) is
      type range0 is new integer range first .. last;
   begin
      null;
   end use_dynamic_range;

begin 
   case z is 
      when 4=> use_dynamic_range(firstArray'first, firstArray'last); 
      when 5=> use_dynamic_range(secondArray'first, secondArray'last); 
      when 6=> use_dynamic_range(1,100); 
   end case;
end x;

因为它是一个本地过程,它在与等效的declare块相同的范围内执行,因此它可以访问X中所有可见的内容,因此您不需要向它传递一个庞大的参数列表。

类似于:

function x return Boolean is
    type Range_Info_Type is
        record
            First : Integer;
            Last  : Integer;
        end record;
    function Get_Range_Info_Type return Range_Info_Type is
    begin
        case z is
            when 4=> return Range_Info_Type'(First => firstArray'First,
                                             Last  => FirstArray'Last);
            when 5=> return Range_Info_Type'(First => secondArray'First,
                                             Last  => secondArray'Last);
            when 6=> return Range_Info_Type'(First => 1,
                                             Last  => 100);
            when others => return Range_Info_Type'(First => 1,
                                                   Last  => 1);
        end case;
    end;
    MyTypeInfo : constant Range_Info_Type := Get_Range_Info_Type;

    -- Now declare the actual type I want to use.
    type range0 is new Integer range MyTypeInfo.First .. MyTypeInfo.Last;

begin
    return true;
end x;
这样一来,declare块可能更容易理解,因为它应该可以做到这一点


请注意,在您的情况下,您不能写入
类型range 0 is range..
,因为
expr
应该是一个静态表达式(请参见RM 3.5.4)

类似于:

function x return Boolean is
    type Range_Info_Type is
        record
            First : Integer;
            Last  : Integer;
        end record;
    function Get_Range_Info_Type return Range_Info_Type is
    begin
        case z is
            when 4=> return Range_Info_Type'(First => firstArray'First,
                                             Last  => FirstArray'Last);
            when 5=> return Range_Info_Type'(First => secondArray'First,
                                             Last  => secondArray'Last);
            when 6=> return Range_Info_Type'(First => 1,
                                             Last  => 100);
            when others => return Range_Info_Type'(First => 1,
                                                   Last  => 1);
        end case;
    end;
    MyTypeInfo : constant Range_Info_Type := Get_Range_Info_Type;

    -- Now declare the actual type I want to use.
    type range0 is new Integer range MyTypeInfo.First .. MyTypeInfo.Last;

begin
    return true;
end x;
这样一来,declare块可能更容易理解,因为它应该可以做到这一点


请注意,在您的情况下,您不能写入
类型range 0 is range..
,因为
expr
应该是一个静态表达式(请参见RM 3.5.4)

为什么排除明显的答案(声明块)?将declare块转换为本地过程是否会作弊?为什么会排除明显的答案(declare块)?将declare块转换为本地过程是否会作弊?完美。:)我不知道在Ada 2012中会有这样的表达。谢谢鲨鱼!您可能还需要查看新的量化表达式:&Perfect.:)我不知道在Ada 2012中会有这样的表达。谢谢鲨鱼!您可能还想看看新的量化表达式:&