Ada枚举类型范围

时间:2011-09-07 17:37:50

标签: enums ada

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

   type Status_Type is
     (Undefined,  
      Available,
      Fout,     
      Assigned,     
      Effected,  
      Cleared); 

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

   subtype Sub_Status_Type is Status_Type
     range Available.. Effected;

   subtype Un_Status_Type is Sub_Status_Type
     range Fout .. Assigned;

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

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

4 个答案:

答案 0 :(得分:9)

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

但应注意,这些值是在场景下分配的。 除非您使用的是'val'pos属性,否则它们确实应该对您没有任何影响,或者您正在与Ada外部编写的代码(或者硬件)。

另外,如果 最终无关紧要,你应该知道情况实际上要复杂得多。 'pos'val在生成代码时不返回编译器用于这些枚举值的实际位值。他们只是回归“顺序位置”;它们与第一个值的偏差。

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

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:2)

  

根据我的理解,Ada在其枚举类型上使用基于0的索引

是的,它使用0作为索引,或者更确切地说是position类型的值。这是枚举文字的值,而不是它们的二进制表示。

  

以下示例的序数值是什么?

没有“序数”值。类型的值是您指定的值。你在这里混淆了“价值”,“代表”和“位置”。

Status_Type的值为UndefinedAvailableOutAssignedEffectedCleared

位置分别为0,1,2,3,4和5.您可以使用'Pos and 'Val进行翻译。

representation默认为该位置,但您可以自由分配其他值(只要您保持正确的顺序)。如果将它写入文件,或通过套接字发送,或将其加载到寄存器中,则使用它们。

答案 3 :(得分:1)

我认为回答问题的最佳方式是相反的:

从数学上讲,子类型是其父类型的连续子集。因此,如果类型SIZES是(1,2,3,4,5,6,7,8)并且您将子类型MEDIUM定义为(4,5),则MEDIUM的第一个元素是4。 例如:

Type Small_Natural is 0..16;
Subtype Small_Positive is Small_Natural'Succ(Small_Natural'First)..Small_Natural'Last;

这定义了两组很小的可能值,它们紧密相关:即正数是除零之外的所有自然数。

我使用此表单来说明通过一些文本更改,我们有以下示例:

Type Device is ( Not_Present, Power_Save, Read, Write );
Subtype Device_State is Device'Succ(Device'First)..Device'Last;

在这里,我们建立了一个直观的概念,即设备必须存在才能具有状态,但请注意,子类型中的值[精确地]是从中派生它们的类型中的值。

这回答了你的第二个问题:是的,枚举的元素将具有与其父类型相同的值。

至于第一个,我认为起始位置实际上是实现定义的(如果不是,那么我假设LM 默认它为0)。然而,您可以自由地覆盖它并提供您自己的编号,唯一的限制是枚举中较早的元素的值小于您当前分配的值[IIRC]。