【问题标题】:ADA integer types?ADA 整数类型?
【发布时间】:2020-05-12 17:46:03
【问题描述】:

i) 第9行会有错误My_DigitTa new type, 所以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 –

【问题讨论】:

  • 1) 没有回答:修复错误的 2 种方法。 2) 没有命名实际会引发的异常。
  • 请发布代码,而不是代码的图像。
  • 你的答案看起来是正确的,但是你没有解释两种不同的方法来修复编译错误。
  • @JimRogers 嗨,吉姆,谢谢
  • @johnKDOEALLISSON:对 Ada 类型转换 的回顾可以帮助您确定修复错误的两种不同方法。

标签: ada


【解决方案1】:

@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 已更改为模块化类型。模块化类型采用模块化算术,以便所有加法运算都会产生一个在声明的值范围内的值。在这种情况下,有效值的范围仍然是 0..9,但 5 + 5 的结果为 0(10 mod 10 为 0)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多