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中会有这样的表达。谢谢鲨鱼!您可能还想看看新的量化表达式:&