2011-09-07 100 views
4

据我了解,小梅在其枚举类型使用基于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?

+0

通常最好从源文件复制并粘贴您的实际代码。我怎么知道你没有?因为'out'是一个保留字。 –

+0

...这是如何改变什么... – systemoutprintln

+0

它可能不会在这种情况下,但我已经看到很多问题,因为海报重新键入代码而不是复制 - 粘贴它。如果有人想编译你的代码来测试它也很有帮助。 –

回答

8

对于子类型,'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); 
+0

但枚举表示子句不影响“Pos”的行为; 'Status_Type'Pos(Cleared)'仍然是5.除非自上一次查看以来已经添加了一些内容,否则没有干净的方法来获取枚举常量的表示编号('Unchecked_Conversion'可以做到这一点,但确定适当的目标类型是非平凡的)。 –

+0

确实如此。它对于语言和H/W界面非常重要,但不是'Pos /'Val。我会尽力澄清,如果我能找到一种方法来做到这一点,而不是将我的答案翻倍。 –

5

位置号在基本类型的定义。所以Sub_Status_Type'Pos(Assigned)是一样的Status_Type'Pos(Assigned),和Sub_Status_Type的位置值从1到4,而不是0到3

(请注意,该位置号码不受枚举表示子句;它总是起始于0代表基本类型的第一个值)。

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

1

我想回答你的问题,最好的办法是在反向:

A亚型是,从数学上讲,它的父类的连续子集。因此,如果类型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; 

在这里,我们正在建模的直观概念,即设备必须存在有一个状态,但请注意,子类型ARE中的​​值[精确地说]是它们派生类型中的值。

这会回答你的第二个问题:是的,枚举元素将具有与其父类型相同的值。对于第一个,我相信起始位置实际上是实现定义的(如果不是,那么我假设LM 默认它为0)。不过,您可以自由地覆盖它并提供自己的编号,唯一的限制是枚举中的元素的价值低于您当前分配的值[IIRC]。

2

据我了解,小梅在其枚举类型

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

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

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

Status_Type的值是UndefinedAvailableOutAssignedEffectedCleared

职位是0,1,2,3,4和5.这些是你可以用来翻译'Pos and 'Val

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

+1

'自由',只是表示值需要与枚举值相同(不太确定为什么,但请参阅http://www.adaic.org/resources/add_content/standards/05rm/html/RM-13 -4.html para 6/2。 –

+0

是的,忘了那个..固定! – oenone