Ada 计算阶乘数

Ada 计算阶乘数,ada,Ada,我自学Ada编程语言,在我使用的教科书中有一个 练习打印出用户输入的数字的阶乘值。我的程序编译并运行正常,我确实得到了预期的输出,但是如果我输入值13,程序就会崩溃并引发错误 我不知道13号为什么会这样。这是IDE的一个错误(我使用GNATStudio)吗?我目前使用的是ADA2012标准。这是我的密码: with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; -- proced

我自学Ada编程语言,在我使用的教科书中有一个 练习打印出用户输入的数字的阶乘值。我的程序编译并运行正常,我确实得到了预期的输出,但是如果我输入值13,程序就会崩溃并引发错误

我不知道13号为什么会这样。这是IDE的一个错误(我使用GNATStudio)吗?我目前使用的是ADA2012标准。这是我的密码:

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
带有Ada.Text\u IO;
使用Ada.Text\u IO;
使用Ada.Integer\u Text\u IO;
使用Ada.Integer\u Text\u IO;
--主程序-开始程序
主要程序是
计数器:整数:=1;
编号:整数:=0;
阶乘:整数:=1;
开始
新线;

而计数器12的阶乘为479001600。乘以13得到13的阶乘,值为6227020800,大于32位二进制数的值

因此,Constraint_错误告诉您Integer类型不能表示13的阶乘——计算溢出。如果要计算较大的阶乘,必须使用“较宽”的整数类型。请注意,整数的宽度是特定于编译器的,尽管保证至少为16位。其他一些编译器可能使用64位整数。Ada的一般建议是根据需要定义自己的整数类型(XX类型的范围为0..83838或其他)


否则,从Ada的角度来看,您的程序看起来还可以。

谢谢!非常感谢。我还将研究其他整数类型。很高兴这是一个逻辑错误。我想知道你认为
main.adb:35溢出检查失败
可能意味着什么?此外,约束错误可能发生在您显示的代码中的第19行,该行仅包含29行,因此您的实际代码一定不同。(以防万一不清楚-
main.adb:35
表示“文件
main.adb
的第35行”)。溢出通常表示内存超出指定的缓冲区值。C与Scanf和get有问题。让我吃惊的是约束错误。以前从未使用过Ada,我主要来自Java背景,这让人感到困惑。谢谢你的意见。