微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ada程序适用于Linux但不适用于GPS Windows 10

在此先感谢您的帮助.我目前正在做一些关于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 举报,一经查实,本站将立刻删除。

相关推荐