gpt4 book ai didi

Ada 95 编译器版本更改,存在转换问题

转载 作者:行者123 更新时间:2023-12-04 00:34:45 25 4
gpt4 key购买 nike

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

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

但现在编译器提示将 Ada.Calendar.Time 转换为 Duration 无效。具体来说,我收到以下错误:

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

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

编辑:

D 是 Duration,Date 是 Ada.Calendar.Time。

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

最佳答案

Ada.Calendar.Time 是私有(private)类型,只有 Ada.Calendar 或 Ada.Calendar 的任何子级(在您的情况下为 Ada.Calendar.GMT)的私有(private)部分或包体才能看到该类型的完整声明,并且类型转换需要 Time 的完整声明才能工作(请注意,尽管不需要 Duration 的范围来支持 Time 的全部范围,因此您也可能在那里遇到一些问题。这在很大程度上取决于实现).

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

关于Ada 95 编译器版本更改,存在转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25986559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com