Ada枚举类型范围

mai*_*rgs 5 enums ada

据我了解,Ada在其枚举类型上使用基于0的索引.因此,在下面的Status_Type中,序数值从0到5.

   type Status_Type is
     (Undefined,  
      Available,
      Fout,     
      Assigned,     
      Effected,  
      Cleared); 
Run Code Online (Sandbox Code Playgroud)

我的问题是......以下示例的序数值是多少?它们从0开始还是从超类型的序数值开始?

   subtype Sub_Status_Type is Status_Type
     range Available.. Effected;

   subtype Un_Status_Type is Sub_Status_Type
     range Fout .. Assigned;
Run Code Online (Sandbox Code Playgroud)

Sub_Status_Type序数值是从1到4还是从0到3?

Un_Status_Type序数值是3到4还是从1到2还是从0到1?

T.E*_*.D. 9

对于子类型,a 'pos将返回与基本类型相同的值(我相信分别为1..4和2..3).子类型不是新的和不同的类型,因为它们是相同的旧类型,但对其可能的值有一些额外的限制.

但应注意,这些值是在场景下分配的.除非你使用和属性,或者你正在连接到Ada(或硬件)之外编写的代码,否则它确实应该对你没有什么影响.'val'pos

另外,如果最终确实存在问题,你应该知道情况实际上要复杂得多.'pos并且'val在生成代码时不返回编译器用于这些枚举值的实际位值.他们只是回归"顺序位置"; 它们与第一个值的偏移量.

默认情况下,它们通常是相同的.但是,您可以使用for ... use子句自行更改值赋值(但不是序数位置赋值),如下面的代码所示:

for Status_Type use
 (Undefined => 1,  
  Available => 2,
  Out       => 4,     
  Assigned  => 8,     
  Effected  => 16,  
  Cleared   => 32); 
Run Code Online (Sandbox Code Playgroud)


Kei*_*son 5

位置编号是根据基本类型定义的.所以Sub_Status_Type'Pos(Assigned)是相同的Status_Type'Pos(Assigned),并且Sub_Status_Type的位置值从1到4,而不是0到3.

(请注意,位置编号不受枚举表示子句的影响;对于基本类型的第一个值,它始终从0开始.)

顺便说一下,通过运行一个打印值的小测试程序可以很容易地找到Sub_Status_Type'Pos(...)- 这也会告诉你不能使用保留字out作为标识符.