2008-09-17 19 views
3

Ich möchte in der Lage sein vorherzusagen, was in der resultierenden Binärdatei sein wird, wenn ich Write in Ada aufrufen, um einen Datensatz zu serialisieren. Weißt du, wo ich das nachsehen kann?Verstehen, wie Ada einen Datensatz serialisiert

Ich habe einige ältere Ada-Software, die eine Binärdatei durch Schreiben eines Datensatzes erzeugt, und ich muss ein C++ - Programm debuggen, das eine kompatible Binärdatei schreiben soll. Also möchte ich verstehen, welche Regeln Ada bei der Serialisierung eines Datensatzes befolgt, damit ich sicherstellen kann, dass der C++ - Code einen funktional gleichwertigen Datensatz erzeugt.

+1

Wenn ich mich nicht irre, ist dies die allererste Ada Frage auf Stackoverflow! Woohoo! –

Antwort

1

Wie von anderen erwähnt, wird der Compiler ohne zusätzliche Anweisungen seine eigenen Entscheidungen über das Layout des Datensatzes treffen. Der beste Ansatz wäre, den ursprünglichen Code zu ändern, um den Datensatz mit einem bestimmten Layout zu schreiben. Insbesondere ermöglicht der record representation clause dem Ada-Programmierer, genau das physikalische Layout für einen Datensatz anzugeben. In der Tat sollten Sie überprüfen, ob der ursprüngliche Code einen dieser für den fraglichen Typ hat. Wenn dies der Fall ist, würde dies Ihre Frage präzise beantworten.

1

Die Ada95 Language Reference Manual sagt (Abschnitt 13.13.2.):

„Für Elementartypen wird die Darstellung in Bezug auf den Stromelemente Implementierung definiert, für zusammengesetzte Typen, die Schreib- oder Leseattribut für jede Komponente in a genannt wird kanonische Reihenfolge. Die kanonische Reihenfolge der Komponenten ist die letzte Dimension, die für ein Array am schnellsten variiert, und die Positionsgesamtordnung für einen Datensatz. "

+0

Danke für die Referenz. Ich hoffe, dass jemand etwas ausführlicher über das Thema geschrieben hat. –

+0

Ada Leute neigen dazu, eine Art von Stiftern für den Standard zu sein. Wir haben keine kanonischen Implementierungen, auf die wir uns beziehen könnten. Also wenn du fragst "Wie macht Ada X?" und jemand antwortet mit "Das ist der Umsetzung widersprochen.", das ist mehr oder weniger das Ende der Sache. –

2

Grundsätzlich wird der Compiler die Komponenten Ihrer Datensatztypen neu anordnen, es sei denn, Sie verwenden das Pragma PACK oder die Pragma PRESERVE_LAYOUT Befehle mit Ihren Datensatztypen. Außerdem wird der Compiler Objekte auffüllen, um die Ausrichtung von Datensatzkomponenten beizubehalten. Komponenten folgen:

Integer: 8, 16, oder 32-Bit-Zweier-Komplement-Zahlen mit Vorzeichen

Float: 32-Bit-IEEE-Format

Long_Float: 64-Bit-IEEE-Format

Fixed-Point : 8, 16 oder 32 Bit; Jedoch können der Bereich und die spezifizierten Deltas beeinflussen 16 oder 32 zu sein

Aufzählungen: Integer, in der Regel erstes Element wird durch 0 dargestellt

Boolesche Werte: Enumeration Objekt, 8 Bit lang, die LSB speichert den Wert: 0 = false , 1 = true

Zeichen: Enumeration Objekt, 8 Bit lang, unsigned 0 bis 127

Zugriffstypen: 32 Bit, 32-Bit-Wert von 0 NULL

Arrays darstellt: zusammenhängend in row- gespeicherten Großauftrag Die Größe hängt vom Basistyp ab. Das Array wird aufgefüllt, um sicherzustellen, dass alle Elemente die richtige Ausrichtung für ihre Typen haben.

3

Das Format der serialisierten Ausgabe von 'Schreiben hat absolut nichts mit Repräsentation Klauseln zu tun.

Standardmäßig gibt der Compiler Datensatzkomponenten ohne Ausrichtungsauffüllung in der Reihenfolge aus, in der sie in der Datensatzdeklaration geschrieben sind. Dabei wird ein Übersetzungsschema verwendet, das nicht vom Standard definiert ist Compiler). GNAT (der GCC-Ada-Compiler) gibt jede Komponente in einer ganzen Anzahl von Bytes aus.

Wenn Sie Werte eines Typs mit einem anderen Format streamen möchten, können Sie 'Schreiben für den Typ überschreiben. Als ungewöhnliches Beispiel könnten Sie nach XML streamen.