Ada.Real_Time.Clock 为不同版本的 GNATPro Ada 编译器返回不同的值

标签 ada

我正在使用 2 个虚拟机 (VMWare);一台 VM 具有 GNATPro Ada 编译器 7.3.2,并且 Ada.Real_Time.Clock 按预期返回自纪元开始以来的秒数。另一个 VM 具有 GNATPro 19.0,Ada.Real_Time.Clock 返回自 VM 启动以来的秒数。
我们在两个虚拟机上都使用 Ada 95。
我已经检查过两个虚拟机上的时间设置是否相同。
为了检查它是否是编译器差异,我在 Gnat Pro 19.0 上编译了一个小测试程序,并在使用旧编译器的虚拟机上运行它。我得到的结果与我在使用较新版本编译器的 VM 上所做的结果相同。然后,我使用旧编译器编译测试程序,并在使用新编译器的 VM 上运行它,并获得与使用旧编译器在 VM 上相同的结果。
我的问题是有人知道如何让 Ada.Real_Time.Clock 返回 GNATPro 19.0 纪元开始的秒数
下面是测试程序。

with Test_Io;
with Ada.Real_Time;
procedure Time_Test is

   Current_Real_Time : Ada.Real_Time.Time;
   Time_Span : Ada.Real_Time.Time_Span;
   Seconds_Count : Ada.Real_Time.Seconds_Count;


begin

    Current_Real_Time := Ada.Real_Time.Clock;

    Ada.Real_Time.Split (
             T => Current_Real_Time,
             Sc => Seconds_Count,
             Ts => Time_Span);
   Test_Io.Put_Line("TRACE: Seconds_Count = " & Seconds_Count'Img);

end Time_Test;

最佳答案

RM D.8说:
“时间值 I 表示以 E+I*Time_Unit 开头并受 E+(I+1)*Time_Unit 限制的半开实时时间间隔,其中 Time_Unit 是实现定义的实数,E 是未指定的原点, 纪元, 对于 Time 类型的所有值都相同. 语言没有指定时间值是否与任何标准时间引用同步. [例如, E 可以对应系统初始化的时间或它可以对应某个时间标准的纪元。]”
所以实现可以自由选择它想要的任何时代。
当你说“时代”时,我假设你心中有一个特定的值(value)? UNIX时间?
对于挂钟行为,使用 Ada.Calendar.Time 可能会更好。

关于Ada.Real_Time.Clock 为不同版本的 GNATPro Ada 编译器返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66157927/

相关文章:

dll - 在 Ada 中动态链接库会引入额外的依赖项

Ada:指定地址子句时发出不兼容的对齐警告

Ada.Containers.Vectors 不适用于 GNAT GPL 2017

ada - 带注释的 Ada 语言(Anna)

ide - 如何在 GPS 中运行 Ada 代码

gcc - Mac OS 的链接器问题

algorithm - 在中间中止递归子程序

ada - Ada 如何成为 'safety critical' 语言?

multithreading - 关于由单个主任务控制的 worker 任务的执行问题

operating-system - 如何在 Ada 中直接访问内存地址?