我正在尝试一个程序从用户那里获取一个数字(从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设置一个循环,并在那里有一个计数器,以便它匹配。但这看起来很乱,效率不高,必须有更好的方法。
答案 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,
...);