在Ada中自定义类型转换

m4t*_*tti 0 indexing types integer ada type-conversion

我有一个由某种类型索引的某种对象的数组index:

type index is new Integer range 1..50;
type table is new Array(index) of expression;
Run Code Online (Sandbox Code Playgroud)

现在,我需要访问其中一个表达式,具体取决于键盘输入的用户.为此我做了以下事情:

c: Character;
get(c);

s: String := " ";
s(1) := c;
Run Code Online (Sandbox Code Playgroud)

最后我可以将角色转换为Integer:

i: Integer;
i := Integer'Value(s);
Run Code Online (Sandbox Code Playgroud)

现在,我有用户想要访问的值的位置,但Ada不允许您访问table,因为它是由索引编制index而不是Integer,它们是不同的类型.

根据用户的输入访问表达式的最佳解决方案是什么?

Kei*_*son 6

type index is new Integer range 1..50;
type table is new Array(index) of expression;
Run Code Online (Sandbox Code Playgroud)

您不需要(也不能拥有)new声明中的关键字table.

c: Character;
get(c);

s: String := " ";
s(1) := c;
Run Code Online (Sandbox Code Playgroud)

最后两行可写为:

S: String := (1 => C);
Run Code Online (Sandbox Code Playgroud)

(假设CS声明的点处可见并初始化).

i: Integer;
i := Integer'Value(s);
Run Code Online (Sandbox Code Playgroud)

这不是"演员".阿达没有演员阵容.它甚至不是类型转换.但我理解你的意思; if C = '4',then S = "4",and Integer'Value(S) = 4.(如果值C不是十进制数字,您应该考虑该怎么做;这将导致Integer'Value(S)提高Constraint_Error.)

现在,我有用户想要访问的值的位置,但Ada不允许您访问table,因为它是由索引编制index 而不是Integer,它们是不同的类型.

简单:不要使用不同的类型:

I: Index := Index'Value(S);
Run Code Online (Sandbox Code Playgroud)