2

在这里完成 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 有没有办法在单个命令中编译和创建可执行文件?

4

2 回答 2

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 编译器。

于 2013-03-05T10:38:49.433 回答
0

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

编译-gnato应该会给你一个执行约束错误。您还可以通过执行生成一行可执行文件

gnatmake -gnato compute.adb
于 2013-03-05T09:05:21.943 回答