ADA 整数类型?

ADA integer types?

i) 第9行会有错误My_DigitT一个新类型, 所以MD不能分配给D.

ii) 第10行会出现越界异常, 你可以通过更改 type Digit is mod 10.

来消除它

有人可以帮助验证这些答案吗?

问题 i)

Digit_T is range 0..9; 
type My_Digit_T is new Digit_T;
 D : Digit_T; 
MD : My_Digit_T(Digit_T); 
begin
 D := 0; 
MD := D;
 D := D + 5 + 5;
 end; 

这个解决方案我将 MD 类型转换为 Digit_T 这应该可行吗?顺便说一下,我厌倦了在线编译器我收到错误 rextester。com/CFFFCP14315 –

@johnKDOEALLISSON 我正在回答你的问题,因为你需要更详细的帮助。 您更改后的代码如下所示:

procedure Main is
   type Digit_T is range 0..9;
   type My_Digit_T is new Digit_T;
   D : Digit_T;
   MD : My_Digit_T(Digit_T); -- This line is not correct.
begin
   D := 0;
   MD := D;
   D := D + 5 + 5;
end Main;

我使用的 GNAT 编译器报告了以下问题:

不能将一种类型转换为另一种类型(第 5 行)。 分配 MD := D 会导致第 8 行出现警告。Digit_T 的范围是 0 到 9。表达式 D := D + 5 + 5;生成值 10,不在 Digit_T.

的有效值集中

如果要将D赋值给MD,它们必须是相同类型的成员,否则D必须转换为My_Digit_T的实例。请注意,您可以将实例转换为另一种类型,但您已尝试将一种类型转换为另一种类型。 另一个解决方案是使 My_Digit_T 成为 Digit_T 的子类型,而不是使其成为一个单独的类型。

对变量 D 使用正确类型转换的解决方案是:

procedure Main is
   type Digit_T is mod 10;
   type My_Digit_T is new Digit_T;
   D : Digit_T;
   MD : My_Digit_T;
begin
   D := 0;
   MD := My_Digit_T(D);
   D := D + 5 + 5;
end Main;

类型 Digit_T 已更改为 modular 类型。模块化类型采用 mod 单元算法,因此所有加法运算的结果都在声明的值范围内。在这种情况下,有效值的范围仍然是 0..9,但 5 + 5 结果为 0(10 mod 10 为 0)。

我将使用子类型的解决方案留给您。