在这里完成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有一种方法可以在一个命令中编译和创建可执行文件吗?
答案 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