在ada编程语言中,是否有一种方法可以创建一个子类型,该子类型采用不同位置的类型枚举?

在ada编程语言中,是否有一种方法可以创建一个子类型,该子类型采用不同位置的类型枚举?,ada,subtype,Ada,Subtype,我正在尝试创建一个子类型,以某个类型的某些枚举为例 type Integers\u type是(1,2,3,4,5,6,7,8,9,10); 我想要这样的东西 子类型奇数型为整数型(1,3,5,7,9); 我知道,当我们使用某个类型的关键字子类型时,我们需要使用range,但问题是枚举不是在一个系列中。对于这种值筛选,我会使用 在您的情况下,根据Keith所说的修改枚举: type Integers\u type是(一、二、三、四、五、六、七、八、九、十); 子类型奇数类型是整数类型 静态_

我正在尝试创建一个子类型,以某个类型的某些枚举为例

type Integers\u type是(1,2,3,4,5,6,7,8,9,10);
我想要这样的东西

子类型奇数型为整数型(1,3,5,7,9);

我知道,当我们使用某个类型的关键字
子类型时,我们需要使用range,但问题是枚举不是在一个系列中。

对于这种值筛选,我会使用

在您的情况下,根据Keith所说的修改枚举:

type Integers\u type是(一、二、三、四、五、六、七、八、九、十);
子类型奇数类型是整数类型
静态_谓词=>奇数_数_类型为1 | 3 | 5 | 7 | 9;
如果要使用数值类型而不是枚举,请使用以下命令

类型整数\u类型的范围为1。。10;
子类型奇数类型是整数类型
使用动态_谓词=>奇数_数_类型mod 2/=0;
有关更多信息,请阅读

编辑:

对于枚举类型,以下代码使用gnatmake-gnata-gnatVa test_enum.adb进行编译,但会警告第14行的错误,并在执行时失败,因为断言与静态谓词对齐

带有Ada.Text\u IO;使用Ada.Text\u IO;
程序测试_Enum为
类型整数是(一,二,三,四,五,六,七,八,九,十);
子类型奇数类型是整数类型
静态_谓词=>奇数_数_类型为1 | 3 | 5 | 7 | 9;
测试I:整数类型:=2;
测试O:奇数\U类型:=1;
开始
放线(“Test_I=“&Integers_Type”图像(Test_I));
放线(“Test_O=“&Odd_number_Type”图像(Test_O));
测试O:=测试I;
放线(“Test_O=“&Odd_number_Type”图像(Test_O));
结束测试枚举;
对于整数类型,使用gnatmake-gnata-gnatVa test_int.adb编译命令,编译器警告检查将在运行时失败,这是触发断言时的情况

带有Ada.Text\u IO;使用Ada.Text\u IO;
程序测试
类型整数\u类型的范围为1。。10;
子类型奇数类型是整数类型
使用动态_谓词=>奇数_数_类型mod 2/=0;
测试I:整数类型:=2;
测试O:奇数类型=1;
开始
放线(“Test_I=“&Integers_Type”图像(Test_I));
放线(“Test_O=“&Odd_number_Type”图像(Test_O));
测试O:=测试I;
放线(“Test_O=“&Odd_number_Type”图像(Test_O));
结束测试;

在这两种情况下,删除-gnata标志将使程序在不考虑谓词的情况下工作,因为断言被取消激活。

您混淆了枚举和整数,如果您来自类似C的地方,这是一个很大的区别:在Ada中,枚举是而不是仅仅是整数的标签

Frédéric Praca给出的答案是绝对正确的,但是(a)您可以在数字类型上使用
静态谓词
;(b)有一种方法可以做到你在问题标题中提出的问题,这与你在问题主体中提出的问题有着微妙的不同

使用子类型谓词的问题在于,您失去了使用特定类型谓词的能力

(a) -
Static\u谓词

类型数字\u范围为0..9;
子类型奇数是数字范围
静态|u谓词=>1 | 3 | 5 | 7 | 9;
(b) -枚举的位置
Ada中有几个属性,其中包括
Pos
&
Val
,和
Pred
&
Succ
。给定一个枚举(
类型示例为(A,B,C,D,E);
,您可以说
示例Pos(D)
,它将返回
3
,您可以说
示例Val(1)
它将返回
B

然后,您可以将这些内容组合在一起创建多个类型,尽管这是一项繁重的工作,通常不是您想要做的

Type Base\u Numeric\u范围为0..9;
类型赔率为范围1..Base_Numeric_range'Pos(Base_Numeric_range'Last))-Base_Numeric_range'Pos(Base_Numeric_range'First))/2;
--这是来自记忆,未经测试;所以在细节上可能是错的。
函数转换(X:基本数值范围)返回几率为
(几率值((基数数值范围位置(X)/2)+1));
函数转换(X:赔率)返回的基本数值范围为
(基数数值范围值(赔率位置X)*2-1);

除非我遗漏了什么,否则您的
整数类型
声明无效。枚举类型的元素必须是标识符(或字符文字),而不是数字<代码>类型整数\u类型范围为1..10是合法的。但我刚刚测试了它,并使用Gnat CE 2019,它没有,而且这两个示例也使用来自Ubuntu19.04的Gnat 9.1.0进行编译,并且在执行时表现相同。。。也许你太快地否决了我,你是对的。我把它误读为混合了枚举类型和整数类型。谢谢frederic,我完全欣赏这个解释,因为它工作起来很有魅力,我使用的GNAT编译器版本中没有编译问题。感谢这个解释,这个想法是为了提供一个可以理解的问题标题示例,此外,我是Ada编程语言的初学者,所以我可以给出一个模棱两可的例子。