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)。
我将使用子类型的解决方案留给您。
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)。
我将使用子类型的解决方案留给您。