2008-09-17 12 views
3

レコードをシリアル化するためにWrite in Adaを呼び出すと、結果のバイナリに何が含まれるのか予測できるようにしたいと考えています。私はこれを見ることができる場所を知っていますか?Adaがレコードをシリアル化する方法を理解する

レコードを書き込んでバイナリファイルを生成するレガシーAdaソフトウェアがあります。互換性のあるバイナリファイルを書き込む予定のC++プログラムをデバッグする必要があります。 C++コードが機能的に同等のレコードを生成できるように、レコードをシリアライズするときにAdaが従う規則を理解したいと思います。

+1

私が間違っていない場合、これはStackoverflowの最初のAda質問です!ウーホー! –

答えて

1

追加の指示がない限り、コンパイラはレコードレイアウトに関する独自の決定を行います。最良の方法は、元のコードを変更して、特定のレイアウトを使用してレコードを書き込むことです。特に、record representation clauseは、Adaプログラマがレコードの物理レイアウトを正確に指定できるようにします。実際には、元のコードに問題のタイプのコードが含まれているかどうかを確認する必要があります。そうであれば、これはあなたの質問に正確に答えます。

1

Ada95 Language Reference Manualは(セクション13.13.2)の言葉:。、ストリーム要素の観点で表現は実装に定義された複合型の場合、各コンポーネントの書き込みまたは読み取り属性で呼び出される基本タイプは、」

をコンポーネントの標準的な順序は、配列の最後の次元が最も速く、レコードの位置的な集約順序が変わります。

+0

参考になりました。私は、誰かがもう少し詳しく話題を書いてくれることを願っています。 –

+0

アダマの人々は、標準のためのsticklersのような傾向があります。私たちは参照するべき慣習的な実装を持っていません。だから、もしあなたが「どのようにアダはXをするのですか?誰かが「それは実装が拒否されました」と返答します。それは多かれ少なかれ問題の終わりです。 –

2

基本的に、コンパイラは、レコードタイプでプラグマPACKまたはプラグマPRESERVE_LAYOUTコマンドを使用しない限り、レコードタイプのコンポーネントの順序を変更します。また、コンパイラはオブジェクトを埋め込み、レコードコンポーネントの整列を維持します。コンポーネントは、次のとおり

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

フロート:32ビットIEEEフォーマット

LONG_FLOAT:64ビットIEEEフォーマット

固定小数点:8,16、または32ビット。しかし、指定された範囲とデルタが16のまたは32

列挙されて影響を与えることができる:列挙オブジェクト、8ビット長、LSB格納値:0 = falseの整数、通常、最初の要素は0

ブール値で表されます。 、1 =真

文字:0の値がNULL

配列を表す32ビット、32ビット、:8ビット長列挙オブジェクト、符号なし0 127の

アクセスタイプを介して行優先に隣接して格納主な注文サイズは基本タイプによって異なります。配列は、すべての要素が型に対して適切な整列を持つようにするためにパディングされています。

3

書込みのシリアル化された出力のフォーマットは、という表現はありません。表現の節とは全く関係ありません。

デフォルトでは、コンパイラは、レコード宣言で書かれた順序で、標準で定義されていない変換スキームを使用して、整列の埋め込みを行わずにレコードコンポーネントを出力します(したがって、コンパイラ)。 GNAT(GCC Adaコンパイラ)は、各コンポーネントを整数バイトで出力します。

異なる形式を使用して型の値をストリーミングする場合は、「型用に書き込む」を上書きできます。珍しい例として、XMLにストリームすることができます。

関連する問題