Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Enums Ada枚举类型范围_Enums_Ada - Fatal编程技术网

Enums Ada枚举类型范围

Enums Ada枚举类型范围,enums,ada,Enums,Ada,据我所知,Ada在枚举类型上使用基于0的索引。。因此,在下面的状态类型中,序号值从0变为5 type Status_Type is (Undefined, Available, Fout, Assigned, Effected, Cleared); 我的问题是。。以下示例的序数值是多少?它们是从0开始还是从超类型的序数值开始 subtype Sub_Status_Type is St

据我所知,Ada在枚举类型上使用基于0的索引。。因此,在下面的状态类型中,序号值从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_类型的序数值是从1到4还是从0到3


Un_Status_Type序数值是否会从3变为4或从1变为2或从0变为1?

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

但应该注意的是,这些值是在场景下指定的除非您使用的是
'val
'pos
属性,或者您正在与Ada之外编写的代码(或硬件)进行接口,否则它们对您来说应该没有什么区别

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

默认情况下,它们通常是相同的东西。但是,您可以使用
为…更改值分配(但不是顺序位置分配)。。。使用
子句,如下代码所示:

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

根据基本类型定义位置编号。因此
Sub\u Status\u Type'Pos(Assigned)
Status\u Type'Pos(Assigned)
相同,Sub\u Status\u Type的位置值从1到4,而不是从0到3

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


顺便说一句,运行一个小测试程序,打印
Sub\u Status\u Type'Pos(…)
,就可以很容易地找到答案——这也会告诉您不能使用保留字
out
作为标识符。

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

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

这定义了两组紧密相关的可能值:即正数是除零以外的所有自然数

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

Type Device is ( Not_Present, Power_Save, Read, Write );
Subtype Device_State is Device'Succ(Device'First)..Device'Last;
在这里,我们对一个直观的概念进行建模,即设备必须存在才能有状态,但请注意,子类型中的值[确切地说]就是派生它们的类型中的值

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

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

据我所知,Ada在枚举类型上使用基于0的索引

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

以下示例的序数值是多少

没有“序号”值。该类型的值是您指定的值。你在这里混淆了“价值”、“表现”和“地位”

您的
状态类型
的值为
未定义
可用
退出
分配
生效
,以及
清除

位置为0、1、2、3、4和5。这些是你可以用来翻译的


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

但是枚举表示子句不会影响
'Pos
的行为<代码>状态\u Type'Pos(已清除)仍将为5。除非自上次查看以来已向语言中添加了一些内容,否则没有干净的方法来获取枚举常量的表示数(
Unchecked\u Conversion
可能可以做到这一点,但确定适当的目标类型并非易事)。True。对于额外的语言和H/W接口来说,这很重要,但不是“Pos/”Val。如果我能找到一种方法,将我的答案的大小增加一倍,那么我将尝试澄清这一点。“freedly”,除了表示值的顺序需要与枚举值的顺序相同(不太清楚为什么,但请参见第6/2段。是的,忘记了那一段..修复了!通常最好发布您的实际代码,从源文件复制并粘贴。我怎么知道您没有这样做?因为
out
是一个保留字…这会如何改变任何事情…在这种情况下可能不会,但我看到了很多相关问题问题是看不见的,因为海报重新键入了代码,而不是复制和粘贴它。如果有人想编译您的代码来测试它,这也很有帮助。
Type Device is ( Not_Present, Power_Save, Read, Write );
Subtype Device_State is Device'Succ(Device'First)..Device'Last;