Ada 如何链接类型';将值顺序转换为整数?

Ada 如何链接类型';将值顺序转换为整数?,ada,Ada,我正在尝试创建一个程序,该程序从用户那里获取一个数字(从1到12),它将返回该月的短格式,例如:如果您编写1,它将返回JAN等 我有以下资料: type Month_Type is (JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC); 但是我如何将它链接到userMonth:Integer。我认为类似于Month_Type(userMonth),但这不起作用,并且给了我错误。我唯一能想到的另一件事是为每个月的类型设置一个循环

我正在尝试创建一个程序,该程序从用户那里获取一个数字(从1到12),它将返回该月的短格式,例如:如果您编写
1
,它将返回
JAN

我有以下资料:

type Month_Type is (JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC);
但是我如何将它链接到
userMonth:Integer。我认为类似于Month_Type(userMonth),但这不起作用,并且给了我错误。我唯一能想到的另一件事是为每个月的类型设置一个循环,并在其中设置一个计数器,以便匹配。但是这看起来很混乱,效率也不高,一定有更好的方法。

在这些方法中,属性
'Val
表示一个函数,它返回一个
Month\u type
类型的值,其位置号等于传递给它的参数的值。例如,表达式
Month\u Type'Val(0)
将计算为
JAN

请注意,属性使用的内部代码不受影响。给定一个声明,例如
userMonth:constant:=1
,使用表达式
Month\u Type'Val(userMonth-1)

使用带有的表示子句时,实现定义的属性表示“返回表示形式与参数匹配的枚举值”的函数。使用建议的表示子句,表达式
Month\u Type'Enum\u Val(userMonth)
将计算为
JAN
,无需调整。

其中,属性
'Val
表示一个函数,该函数返回
月份类型的值,其位置号等于传递给它的参数值。例如,表达式
Month_Type'Val(0)
将计算为
JAN

请注意,属性使用的内部代码不受影响。给定一个声明,例如
userMonth:constant:=1
,使用表达式
Month\u Type'Val(userMonth-1)


使用带有的表示子句时,实现定义的属性表示“返回表示形式与参数匹配的枚举值”的函数。使用建议的表示子句,表达式
Month\u Type'Enum\u Val(userMonth)
将计算为
JAN
,无需调整。

在Ada中,您可以更轻松地进行:

带有Ada.Text\u IO;
程序演示是
类型月份\类型为(1月、2月、3月、[…]月、12月);
package Month_Text_IO是新的Ada.Text_IO.Enumeration_IO(Month_类型);
输入:月份类型;
开始
月\文本\ IO.Get(输入);
结束演示;

无需处理介于两者之间的整数值。

在Ada中,您可以更轻松地处理:

带有Ada.Text\u IO;
程序演示是
类型月份\类型为(1月、2月、3月、[…]月、12月);
package Month_Text_IO是新的Ada.Text_IO.Enumeration_IO(Month_类型);
输入:月份类型;
开始
月\文本\ IO.Get(输入);
结束演示;

不需要处理中间的整数值。

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

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

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

因此:


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

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

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

因此:


作业您可能对JAN和to forth在该类型中的职位感兴趣。为此,请查看“Pos”属性。或者简单地使用一个反映您所写内容的条件:if…1那么…return
JAN
…为什么要使用
Integer
作为输入?如果仅允许用户输入
1。。12
,则应使用适当的类型:
类型月份号范围为1。。12;
@jacobsparrenadersen这有什么好处?如果输入13怎么办?会出错吗?没错。所以你要避免不正确的输入。。。。鼓轮<代码>Ada.Text\u IO.Integer\u IO
:-)当你用Ada编程时,有Ada语言参考手册()来查找这些东西是很有用的?您可能对JAN和to forth在该类型中的职位感兴趣。为此,请查看“Pos”属性。或者简单地使用一个反映您所写内容的条件:if…1那么…return
JAN
…为什么要使用
Integer
作为输入?如果只允许用户输入
1。。12
,则应使用适当的类型:
类型月份号范围为1。。12;
@jacobsparrenadersen这有什么好处?如果输入13怎么办?会出错吗?没错。所以你要避免不正确的输入。。。。鼓轮<代码>Ada.Text\u IO.Integer\u IO
:-)当您在Ada中编程时,查阅Ada语言参考手册()非常有用。但是,您必须使用
未选中的\u转换
将整数类型映射到
月份类型
:-(见上面垃圾神的答案,了解GNAT的
'Enum\u Val
。但是,你必须使用
未经检查的\u转换
从整数类型映射到
月份类型
:-(见上面垃圾神的答案,了解GNAT的
'Enum\u Val
)。
type Month_Type is (JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC);
for Month_Type use (
        JAN => 1,
        FEB => 2,
        ...);