据我了解,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?
对于子类型,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)
位置编号是根据基本类型定义的.所以Sub_Status_Type'Pos(Assigned)是相同的Status_Type'Pos(Assigned),并且Sub_Status_Type的位置值从1到4,而不是0到3.
(请注意,位置编号不受枚举表示子句的影响;对于基本类型的第一个值,它始终从0开始.)
顺便说一下,通过运行一个打印值的小测试程序可以很容易地找到Sub_Status_Type'Pos(...)- 这也会告诉你不能使用保留字out作为标识符.