1

我正在尝试将设备注册为枚举。从寄存器读取有 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

枚举是否有可能具有重复值?

4

3 回答 3

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 在底部的帖子是对您问题的直接回答。

于 2013-08-28T11:57:21.357 回答
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;
于 2013-08-28T17:32:56.827 回答
3

不,您不能对不同的枚举表示使用相同的值。但是除了不能使用相同的值之外,还有更多的原因,因为这些值必须是“不同的”并且“满足类型的预定义排序关系”,即按升序排列。RM 13.4(6/2)

Arjun 建议为此使用两种不同的类型非常好。它既消除了您的具体问题,又明确了读取代码和写入代码之间的区别。

于 2013-08-28T13:41:17.857 回答