我正在自学Ada编程语言,在我使用的课本中,有一个练习可以打印出用户输入的数字的阶乘值。我的程序编译并运行得很好,我确实得到了预期的输出,但如果我键入值13,程序就会崩溃并引发错误。
我不知道为什么数字13会这样。IDE (我使用GNAT Studio)和我当前使用的Ada 2012标准有问题吗?下面是我的代码:
with Ada.Text_IO;
use Ada.Text_IO;
with Ada.Integer_Text_IO;
use Ada.Integer_Text_IO;
-- procedure main - begins the program
procedure main is
counter : Integer := 1;
number : Integer := 0;
factorial : Integer := 1;
begin
New_Line;
while counter <= 5 loop
Put("Enter an integer: ");
Get(number);
for Count in 1 .. number loop
factorial := factorial * Count;
end loop;
Put_Line("Factorial value is: " & integer'image(factorial));
factorial := 1;
counter := counter + 1;
end loop;
New_Line;
end main; -- end procedure main错误消息如下:引发CONSTRAINT_ERROR : main.adb:35溢出检查失败2021-04-11 13:25:10进程已退出,状态为1,运行时间: 02.07s
这看起来是一个很小的问题,但我只是想知道是代码有问题,还是我使用的软件出现了普遍的bug。
提前谢谢你。
发布于 2021-04-11 21:24:34
12的阶乘是479,001,600。乘以13得到13的阶乘,其值是6,227,020,800,它大于32位二进制数。
因此,Constraint_Error告诉您Integer类型不能表示13的阶乘--计算溢出。如果你想计算更大的阶乘,你必须使用“更宽”的整数类型。请注意,Integer的宽度是特定于编译器的,但保证至少为16位。其他一些编译器可能会使用64位整数。Ada的常规建议是定义您自己的整数类型(类型XX的范围为0 ..83838或更多),这取决于您需要什么。
否则,从Ada的角度来看,你的程序看起来还不错。
https://stackoverflow.com/questions/67044964
复制相似问题