5

Write in Adaを呼び出してレコードをシリアル化すると、結果のバイナリがどうなるかを予測できるようにしたいと思います。私がこれをどこで調べることができるか知っていますか?

レコードを書き込むことによってバイナリファイルを生成するレガシーAdaソフトウェアがいくつかあり、互換性のあるバイナリファイルを書き込むことになっているC++プログラムをデバッグする必要があります。したがって、C ++コードが機能的に同等のレコードを生成することを確認できるように、Adaがレコードをシリアル化するときにどのようなルールに従うかを理解したいと思います。

4

4 に答える 4

5

'Write のシリアル化された出力の形式は、表現句とはまったく関係ありません。

デフォルトでは、コンパイラは、標準で定義されていない変換スキームを使用して、レコード宣言に記述されている順序でアラインメント パディングなしでレコード コンポーネントを出力します (そのため、コンパイラ間の相互運用性が得られない場合があります)。GNAT (GCC Ada コンパイラ) は、各コンポーネントを整数バイトで出力します。

異なる形式を使用して型の値をストリーミングする場合は、その型の 'Write. 珍しい例として、XML にストリーミングできます。

于 2008-11-25T23:29:54.310 に答える
4

基本的に、プラグマ PACK またはプラグマ PRESERVE_LAYOUT コマンドをレコード タイプで使用しない限り、コンパイラはレコード タイプのコンポーネントを並べ替えます。また、コンパイラはオブジェクトをパディングして、レコード コンポーネントの位置合わせを維持します。コンポーネントは次のとおりです。

整数: 8、16、または 32 ビットの 2 の補数の符号付き数値

Float: 32 ビット IEEE 形式

Long_Float: 64 ビット IEEE 形式

固定小数点: 8、16、または 32 ビット。ただし、指定された範囲とデルタは、16 または 32 であることに影響を与える可能性があります。

列挙型: 整数、通常、最初の要素は 0 で表されます

ブール値: 列挙型オブジェクト、長さ 8 ビット、LSB には次の値が格納されます: 0 = false、1 = true

文字: 列挙オブジェクト、長さ 8 ビット、符号なし 0 ~ 127

アクセス タイプ: 32 ビット、0 の 32 ビット値は NULL を表します

配列: 行優先順で連続して格納され、サイズは基本型によって異なります。配列は、すべての要素がその型に対して適切に配置されるようにパディングされます。

于 2008-09-17T16:20:11.980 に答える
3

他の人が述べたように、追加の指示がなければ、コンパイラはレコードのレイアウトについて独自の決定を下します。最善の方法は、特定のレイアウトを使用してレコードを書き込むように元のコードを変更することです。特に、レコード表現句により、Ada プログラマーはレコードの物理レイアウトを正確に指定できます。実際、元のコードに問題のタイプのこれらのいずれかがあるかどうかを確認する必要があります。もしそうなら、これはあなたの質問に正確に答えるでしょう。

于 2008-09-17T22:19:53.410 に答える
2

Ada95 Language Reference Manualには次のように書かれています (セクション 13.13.2):

「基本型の場合、ストリーム要素に関する表現は実装定義です。複合型の場合、各コンポーネントの書き込みまたは読み取り属性は正規の順序で呼び出されます。コンポーネントの正規の順序は、配列に対して最も速く変化する最後の次元です。レコードの位置集約順序。」

于 2008-09-17T16:06:24.060 に答える