简单的Ada程序输出错误

时间:2013-03-05 08:51:47

标签: compilation ada gnat

在这里完成Ada的初学者。 我正在尝试编译并运行一个简单的Ada程序,从这里开始:http://www.dwheeler.com/lovelace/s1sf.htm

以下是代码:

-- Demonstrate a trivial procedure, with another nested inside.
with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Integer_Text_IO;

procedure Compute is

 procedure Double(Item : in out Integer) is
 begin -- procedure Double.
   Item := Item * 2;
 end Double;

 X : Integer := 1;   -- Local variable X of type Integer.

begin -- procedure Compute
 loop
  Put(X);
  New_Line;
  Double(X);
 end loop;
end Compute;

我在Linux上,使用gnat所以我这样做:

gnatmake -c compute.adb
gnatmake compute

这给了我可执行文件。运行可执行文件会给出一个零列表,因为它似乎将X初始化为0,即使它将其初始化为1,所以我获取列表1,2,4,...

任何人都可以解释我的代码或我的想法错在哪里?哦,使用gnat有一种方法可以在一个命令中编译和创建可执行文件吗?

2 个答案:

答案 0 :(得分:2)

我只能猜到当你添加“-gnato”时,gnatmake只回复gnatmake: "compute" up to date.给你留下相同的可执行文件。

brian@Gannet:~/Ada/Play$ gnatmake -gnato compute.adb
brian@Gannet:~/Ada/Play$ ./compute
          1
          2
...
  536870912
 1073741824
raised CONSTRAINT_ERROR : compute.adb:9 overflow check failed

然后没有-gnato(我必须触摸源或我得到“最新”消息)

brian@Gannet:~/Ada/Play$ gnatmake compute.adb
brian@Gannet:~/Ada/Play$ ./compute
          1
          2
...
  536870912
 1073741824
-2147483648
          0
          0
          0
          0

随后显示为一串零。添加额外的“if”语句触及文件,强制重新编译:“if”本身并不是绝对必要的(虽然测试和防止约束错误是一件好事!)

道德:没有-gnato,或者更确切地说,至少没有标志-gnataoE -fstack_check,Gnat不是Ada编译器。

答案 1 :(得分:0)

当你每次加倍整数值而没有任何延迟时,它会快速溢出。在GNAT中,默认情况下溢出检查已关闭,您可以使用-gnato开关启用它。因此,当整数值溢出时,它最终会变为0,这就是您所看到的内容(输出速度太快,无法看到初始数字)。

使用-gnato进行编译会在执行时出现约束错误。您还可以通过执行

生成一行可执行文件
gnatmake -gnato compute.adb