在此先感谢您的帮助.我目前正在做一些关于ada编程的初学者工作,我已经安装了http://libre.adacore.com/download/configurations#的GNAT Programming Studio(GPS)
我有Windows 10 64位.我在学校给了以下代码:
pragma Task_dispatching_Policy(FIFO_Within_Priorities);
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Real_Time; use Ada.Real_Time;
procedure PeriodicTasks is
Start : Time;
package Duration_IO is new Ada.Text_IO.Fixed_IO(Duration);
package Int_IO is new Ada.Text_IO.Integer_IO(Integer);
task type T(Id: Integer; Period : Integer) is
pragma Priority(Id);
end;
task body T is
Next : Time;
X : Integer;
begin
Next := Start;
loop
Next := Next + Milliseconds(Period);
-- Some dummy function
X := 0;
for Index in 1..5000000 loop
X := X + Index;
end loop;
Duration_IO.Put(To_Duration(Clock - Start), 3, 3);
Put(" : ");
Int_IO.Put(Id, 2);
Put_Line("");
delay until Next;
end loop;
end T;
-- Example Task
Task_P10 : T(10, 250);
Task_P12 : T(12, 500);
Task_P14 : T(14, 500);
Task_P16 : T(16, 250);
Task_P18 : T(18, 500);
Task_P20 : T(20, 250);
begin
Start := Clock;
null;
end PeriodicTasks;
我在GPS中打开文件,构建它(没有错误)并运行它但它没有显示任何打印输出.我听说有时你会遇到多核cpu的问题,所以每次打开gps.exe时,cpu亲和力都只设置为一个cpu,它总是“以管理员身份运行”.但是,这也没有用,我没有输出.
我决定使用Oracle Virtual Box并设置一个只有一个处理器的Ubuntu OS(32位).安装了GNAT工具,用gnatmake编译,用./periodictasks运行,然后猜猜是什么,程序做了它应该做的事情并打印出信息.
在这么长的故事之后,有人知道为什么会这样吗?可能是64位vs 32位情况?
非常感谢你!
解决方法:
直到最近,GNAT默认情况下都没有检查整数溢出.它确实检查了约束错误,例如将0分配给正数.
我们中的许多人认为这是编译器开发人员的一个奇怪的选择,因为它导致了许多问题,其根本原因是无法处理整数溢出.最近的变化让我们假设开发人员现在同意了!
由于声明,您的问题就出现了
for Index in 1..5000000 loop
X := X + Index;
end loop;
这将最终得到X~10 ^ 13,它不适合32位整数(它将适合64位整数,但如果不是所有GNAT平台,那将是一个Long_Long_Integer).
您的Windows编译器可能是GNAT GPL 2016,它显示了新行为,而Ubuntu编译器是较旧的FSF GCC.
您可以使用编译器开关-gnato0告诉Windows编译器使用旧行为.
您可以使用编译器开关-gnato告诉您的Ubuntu编译器使用新行为.
要获取有关任务中未处理的异常(否则会以静默方式死亡)的异常消息,您可以添加
GNAT.Exception_Traces.Trace_On (GNAT.Exception_Traces.Unhandled_Raise);
在主程序的开头.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。