枚举型自加——Ada应用实例之六
帖子[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的值超出范围时将引发异常。