如何将类型的值按顺序链接到整数?

时间:2017-03-10 05:43:46

标签: ada

我正在尝试一个程序从用户那里获取一个数字(从1到12)并且它将返回该月份的简短形式,例如:如果你写1它将返回{ {1}}等等。

我有以下内容:

JAN

但如何将其与type Month_Type is (JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC); 相关联。我认为像Month_Type(userMonth)这样的东西,但这没有工作,给了我错误。我能想到的唯一另一件事是为每个Month_Type设置一个循环,并在那里有一个计数器,以便它匹配。但这看起来很乱,效率不高,必须有更好的方法。

3 个答案:

答案 0 :(得分:7)

在Ada,你可以更容易地做到这一点:

with Ada.Text_IO;
procedure Demo is
   type Month_Type is (Jan, Feb, Mar, [...], Dec);
   package Month_Text_IO is new Ada.Text_IO.Enumeration_IO (Month_Type);
   Input : Month_Type;
begin
   Month_Text_IO.Get (Input);
end Demo;

无需处理中间的整数值。

答案 1 :(得分:4)

Operations of Discrete Types中,属性'Val表示一个函数,它返回类型Month_Type的值,其位置编号等于传递给它的参数的值。例如,表达式Month_Type'Val(0)将评估为JAN

请注意,属性使用的内部代码不受Enumeration Representation Clause的影响。给定诸如userMonth : constant := 1之类的声明,请使用表达式Month_Type'Val(userMonth - 1)

当使用带有GNAT的表示子句时,实现定义属性'Enum_Val表示“返回其表示与参数匹配的枚举值”的函数。使用代表性条款建议here,表达式Month_Type'Enum_Val(userMonth)将在不进行调整的情况下评估为JAN

答案 2 :(得分:3)

作为其他答案的补充,您还可以使用Ada表示子句将枚举与您喜欢的输入/输出值匹配。

如果您需要将代码与可能未在Ada中编码的其他软件接口,这非常有用。

这有一些限制:如果我的记忆力很好,你需要提升数字。

所以:

type Month_Type is (JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC);
for Month_Type use (
        JAN => 1,
        FEB => 2,
        ...);