我正在尝试将设备注册为枚举。从寄存器中读取有2个值 - > 0表示完成,1表示待定。同样,写入寄存器有2个值 - > 0没有动作,1执行重置。所以,我写了以下代码
type Soft_Reset is (Done, Pending, No_Action, Reset);
for Soft_Reset use
(Done => 0,
Pending => 1,
No_Action => 0,
Reset => 1);
但这会引发错误
gcc-4.6 -c -g -gnatg -ggdb -I- -gnatA /home/sid/tmp/device.adb
device.ads:93:20: enumeration value for "No_Action" not ordered
gnatmake: "/home/sid/tmp/device.adb" compilation error
枚举是否可能具有重复值?
答案 0 :(得分:9)
我不这么认为。但是我认为创建两个枚举类型会更加优雅,这两个枚举类型指示对应于寄存器的可读值的另一个,另一个对应于可写值。
类似的东西:
type Register_Status is (Done, Pending) -- Values that can be read
type Soft_Reset is (No_Action, Reset) -- Values that can be written
Gneuromante在帖子底部的帖子直接回答了你的问题。
答案 1 :(得分:4)
另一种选择是重命名值。枚举值可以重命名为函数:
type Soft_Reset is (Done, Pending);
for Soft_Reset use
(Done => 0,
Pending => 1);
function No_Action return Soft_Reset renames Done;
function Reset return Soft_Reset renames Pending;
答案 2 :(得分:3)
不,您不能对不同的枚举表示使用相同的值。但是它不仅仅是不能使用相同的值,因为值必须是“distinct”和“满足类型的预定义排序关系”,即按升序排列。 RM 13.4(6/2)
Arjun建议为此目的使用两种不同的类型是非常好的。它既消除了您的特定问题,又明确了读取代码和写代码之间的区别。