枚举型自加——Ada应用实例之六

 

枚举型自加——Ada应用实例之六

 

有两个帖子([1] [2])提出了枚举型变量自加的问题。

帖子[1]中定义了如下类型:

typedef enum  CLCMD

{

    CLEAR_ALL   = 0,    //清除屏幕所有内容

    CLEAR_TXT   = 1,    //清除屏幕除第一行外所有内容

    CLEAR_ROW_1 = 2,    //清除第1

    CLEAR_ROW_2 = 3,    //清除第2

    CLEAR_ROW_3 = 4,    //清除第3

    CLEAR_ROW_4 = 5,    //清除第4

    CLEAR_ROW_5 = 6,    //清除第5

    CLEAR_ROW_6 = 7,    //清除第6

    CLEAR_ROW_7 = 8,    //清除第7

    CLEAR_ROW_8 = 9,    //清除第8

    CLEAR_ROW_9 = 10,   //清除第9

}CLCMD;

 

然后在某个函数里面定义了:

CLCMD cmd = CLEAR_ALL;

cmd++;

如果按C++编译,将报告错误“error C2676: binary '++' : 'enum CLCMD' does not define this operator or a conversion to a type acceptable to the predefined operator”。编译提示用户要为枚举类型定义++操作。

如果按C编译,则没有错误。但这个自加是不安全的。cmd等于CLEAR_ROW_9时执行自加后超出了CLCMD的值域。

另外,如果相邻两个枚举分量的值不是相差1,那么++操作也是没有意义的。

Ada对枚举类型提供了安全、方便的操作。现用Ada定义CLCMD如下:

type CLCMD is

(

    CLEAR_ALL   = 0,    -- 清除屏幕所有内容

    CLEAR_TXT,       -- 清除屏幕除第一行外所有内容

    CLEAR_ROW_1,    -- 清除第1

    CLEAR_ROW_2,    -- 清除第2

    CLEAR_ROW_3,    -- 清除第3

    CLEAR_ROW_4,    -- 清除第4

    CLEAR_ROW_5,    -- 清除第5

    CLEAR_ROW_6,    -- 清除第6

    CLEAR_ROW_7,    -- 清除第7

    CLEAR_ROW_8,    -- 清除第8

    CLEAR_ROW_9     -- 清除第9

);

 

枚举量默认定义的位置数(position number)从0开始,也可以用以下方式指定枚举量的位置数:

for CLCMD use

(

    CLEAR_ALL   => 0,    -- 清除屏幕所有内容

    CLEAR_TXT   => 1,    -- 清除屏幕除第一行外所有内容

    CLEAR_ROW_1 => 2,    -- 清除第1

    CLEAR_ROW_2 => 3,    -- 清除第2

    CLEAR_ROW_3 => 4,    -- 清除第3

    CLEAR_ROW_4 => 5,    -- 清除第4

    CLEAR_ROW_5 => 6,    -- 清除第5

    CLEAR_ROW_6 => 7,    -- 清除第6

    CLEAR_ROW_7 => 8,    -- 清除第7

    CLEAR_ROW_8 => 9,    -- 清除第8

    CLEAR_ROW_9 => 10   -- 清除第9

);

 

枚举类型有以下属性:

a)      First:表示该类型的第一个分量,例如,CLCMD’First = CLEAR_ALL

b)      Last:表示该类型的最后一个分量,例如,CLCMD’Last = CLEAR_ROW_9

c)      Succ:表示某个分量的下一个分量,例如,CLCMD’Succ(CLEAR_ALL) = CLEAR_TXT

d)      Pred:表示某个分量的上一个分量,例如,CLCMD’Pred(CLEAR_ TXT) = CLEAR_ ALL

e)      Pos:表示某个分量的位置数,例如,CLCMD’Pos(CLEAR_ALL) = 0

f)      Val:表示某个分量的枚举值,例如,CLCMD’Val(0) = CLEAR_ALL

这样,如果++操作的目的是取下一个分量,那就可以使用属性Succ

如果使用了超出范围的位置数,例如,CLCMD’Val(11),那么编译将发出警告。如果位置数是一个变量,例如,CLCMD’Val(x),那么在运行期间当x的值超出范围时将引发异常。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值