3

私は、もともと GNAT 3.13a1 を使用してコンパイルされたレガシー Ada 95 プロジェクト (他の会社から継承されたもの) に取り組んでいます。コンパイラを 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 の実装をコピーしたようです。そのファイルは、Split プロシージャで同じキャストを実行します。では、標準ライブラリがそれを実行しても問題ないのはなぜですか?

4

3 に答える 3

3

Ada.Calendar.Time は非公開型であり、Ada.Calendar または Ada.Calendar の子 (この場合は Ada.Calendar.GMT) の非公開部分またはパッケージ本体のみが、型の完全な宣言を見ることができます。型キャストが機能するには、Time の完全な宣言が必要です (ただし、Duration の範囲は Time の全範囲をサポートするために必要ではないことに注意してください。そのため、いくつかの問題が発生する可能性もあります。これは実装に大きく依存します)。

GNAT では、ランタイム (Ada. 、System. 、GNAT.*) でパッケージを作成または変更することはデフォルトで禁止されていますが、-gnatg を使用してコンパイルすると、これが有効になります。(-gnatg を使用して他のパッケージをコンパイルすることはお勧めしません。これは、必要でない/望まない可能性のある一連の警告、スタイル チェックなども有効にするためです)

于 2014-09-23T06:28:12.887 に答える