Ada 95编译器版本更改,有铸造问题

时间:2014-09-23 03:49:23

标签: ada gnat

我正在研究一个最初使用GNAT 3.13a1编译的遗留Ada 95项目(继承自其他公司)。我已将编译器更新为GNAT 4.7.4,以便访问我想在进一步开发中使用的一些GNAT库,但我使用的是-gnat95标志。

我无法编译特定文件。这有点奇怪,因为它被命名为“Ada.Calendar.GMT”。这对新编译器来说是一个问题,因为它抱怨我无法在Ada包树中定义一个包的子包。我认为这不是一个太大的问题,所以我将包的名称更改为“GMT_Library”,导入Ada.Calendar以访问它的类型,并更改文件的名称以适应(以防止进一步编译警告)。

但是现在编译器抱怨将Ada.Calendar.Time强制转换为持续时间是无效的。具体来说,我收到以下错误:

180.       D := Duration (Date);
                         |
     >>> illegal operand for numeric conversion

除了更改包名称和导入Ada.Calendar之外,我没有以任何其他方式更改此源文件或相应的spec文件。为什么在GNAT 3.13a1中这是允许的操作?为什么它不再有效,是否有解决方案?

编辑:

D是持续时间,而日期是Ada.Calendar.Time。

经过进一步调查,看来原始开发人员大多都复制了Ada.Calendar定义here的实现。该文件在Split过程中执行相同的强制转换。那么为什么标准库可以做呢?

3 个答案:

答案 0 :(得分:2)

Ada.Calendar.Time是私有类型,只有Ada.Calendar的私有部分或包体或Ada.Calendar的任何子级(在您的Ada.Calendar.GMT中)可以看到该类型的完整声明并且需要完整的时间声明才能使类型转换工作(请注意,虽然持续时间的范围不需要支持整个时间范围,因此您可能也会遇到一些问题。这是高度依赖于实现的)。

在GNAT中,默认情况下禁止您在运行时创建或修改任何包(Ada。,System。,GNAT。*),但使用-gnatg进行编译将启用此功能。 (不建议使用-gnatg编译其他软件包,因为它会打开一堆警告,样式检查等,你可能不需要/想要)

答案 1 :(得分:0)

Ada.Calendar可以将Ada.Calendar.Date转换为Duration,因为它可以看到私有视图,如果可以将其编译为Ada.Calendar.GMT

@egilhh是对的,您可以使用-gnatg启用此功能,但我不一定反对它(尽管您可能在编译应用程序with Ada.Calendar.GMT;)时遇到问题。 / p>

作为替代方案,您可以在重命名的Ada.Unchecked_Conversion中使用GMT_Library

无论你走哪条路,都要意识到Ada.Calendar.Time的时代在GNAT 95和GNAT 05之间发生了变化。在GNAT 95中,时代是Unix时代(1970-01-01 00:00:00.00)。最简单的方法可能是使用转换为Ada.Calendar.Time_Of (Year => 1970, ...)的{​​{1}}作为计算的基础。

答案 2 :(得分:0)

当您想到它时,时间是特定时刻,而持续时间表示自特定事件以来经过的时间。因此,从一个转换为另一个在语义上没有意义,这就像从公斤转换为米(或美国人的磅数到英寸)。

现在,GNAT运行时本身并未在Ada中实现,而是在具有不同权限和设置的略有不同的版本中实现(这就是为什么必须使用-gnatg进行编译)。当然,差异很微妙。

当与C库接口(没有那么强的打字)时,通常情况下我们最终必须以像Ada这样的强类型语言无意义的方式转换类型,所以你不应该在自己的包中做同样的事情。也许使用Unchecked_Conversion会起作用,但我真的不推荐它。

尝试根据其Ada.Calendar.GMT软件包的名称(始终存在风险)猜测其意图,在我看来,您应该查看Ada05的Ada.Calendar.Time_Zones软件包或Ada.Calendar.Conversions 。从技术上讲,这些不是Ada95,但我相信它们兼容。