Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - komme in Delphi nicht zum selben Ergebnis wie Turbo Pascal


J.Borchert - Di 18.11.03 21:45
Titel: komme in Delphi nicht zum selben Ergebnis wie Turbo Pascal
Habe ein Programm in Pascal (DOS) gehabt, das meine Datensätze in eine Datei schreibt. Hat prima funktioniert.
Formatbeispiel:

Quelltext
1:
2:
3:
4:
5:
6:
{$N+ , $E+ }

type Messpunkt = record
         Kilometrierung : double;
         Mastnummer     : array[1..6] of byte;
 { usw... }

Nun habe ich eine WIN-Version programmiert, die das Gleiche Ergebnis bringen soll:


Quelltext
1:
2:
3:
type  Messpunkt = packed record
         Kilometrierung : double;
{ usw...}


Das funktioniert aber nicht. Das alte DOS-Programm, mit dem die gespeicherten Dateien verarbeitet werden müßen, zeigt sogar (kilometrierung) richtig in seiner Tabelle an aber wenn ich die Daten in den Theodolithen (denkt an die Vermessungsbüros) lade, dann sehe ich dort nur noch Hyroglyphen. Im Hex-Editor sieht man auch den Unterschied:

user defined image

Der scharz gekennzeichnete 8-Bytes-Double wird aus verschiedenen Bytes gebildet, aber ergibt beim Einlesen immer die gleiche Zahl:
106448 (in beiden Dateien)
Die Datei mit der Endung FP1 ist das richtige Format. (unten) Diese wurde also mit dem DOS-Programm erstellt. (erster Quelltext oben)

Was kann ich also tun, um auch von Windows her zum gleichen Ergebnis zu kommen ?

Wäre für Eure Hilfe wirklich dankbar.... :?:


Delete - Di 18.11.03 22:33

In der Delphi Version ahst du einen packed record genommen. Die Ausrichtung der Felder an Byte-Grenzen wird also nicht vorgenommen. Laß das einfach mal weg. Das ist jetzt so der einzige Unterschied, den ich an deinem etwas mageren Code sehe. Hast du die Schreibroutinen auch geändert?


J.Borchert - Do 20.11.03 19:21

Den packed record habe ich benutzt, da ohne packed ein folgender String nur in 6bytes groß ist. Das würde dann zu dem DOS-Format überhaupt nichtmehr passen. Dann hätte ein Record nicht mehr 62 bytes.

http://www.delphi-forum.de/viewtopic.php?t=16017&highlight=packed+record

Dort habe ich schonmal mit dem Problem gekämpft. Schien aber gelöst.

Erst jetzt sehe ich, das eine andere Struktur der Bytes vorhanden ist.

Also wie weiter ?
So sieht der ganze record aus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Messpunkt = packed record
         Kilometrierung   : double;
         Mastnummer      : array[1..6] of byte;
         BezugRichtung   : array[1..2] of byte;
         BezugHebung     : array[1..2] of byte;
         AbstandSoll        : double;
         AbstandIst         : double;
         Verschiebung     : array[1..2] of byte;
         HoeheSollwert    : array[1..2] of byte;
         HoeheIstwert      : array[1..2] of byte;
         Hebung              : array[1..2] of byte;
         UeberhoehungS  : array[1..2] of byte;
         UeberhoehungI   : array[1..2] of byte;
         SpannmassSoll   : double;
         SpannmassIst    : double;
         end;


Und dies soll dann 62bytes ergeben. 200 dieser "Messpunkte" sind immer eine Datei.

Vielleicht fällt Euch ja noch etwas ein.......


Delete - Do 20.11.03 20:31

Du hast den Sinn von packed wohl nicht verstanden. Normalerweise werden Records an Wort oder Doppelwort Grenzen ausgerichtet, damit der Zugriff schneller ist. Um Speicherplatz zusparen kann man einen Record mit dem reservierten Wort packed deklarieren, damit werden die Felder eines Records nicht mejr an Wort oder Doppelwort Grenzen ausgerichtet. Der Record wird also kleiner.

Es dürfte wohl einfach daranliegen, dass die Datentypen eine andere Größe haben mit der das DOS programm, wohl 16-Bit, kompiliert wurde. Kuck mal ob Double unter 16-Bit genauso groß ist, wie unter 32-Bit. Gleiches gilt für den Datentyp Byte - obwohl da kann ich es mir nicht vorstellen.


maximus - Do 20.11.03 22:58

dann teste doch mal mit der compiler-direktive {$A2} das alignment auf 16bit zu stellen! Selbstredend ohne packed:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Code: 

{$N+ , $E+ } 

{$A2} 

type Messpunkt = record 
         Kilometrierung : double; 
         Mastnummer     : array[1..6of byte; 
{ usw... }  

...

{$A4}


viel glück.


Sven - Fr 21.11.03 09:21

Könnte es sein, daß das alte TP-Programm 6-Byte Reals verwendet?


J.Borchert - Fr 21.11.03 11:33

Ich habe maximus seinen Vorschlag probiert und komme damit wohl auf die selbe Bytes-Struktur. Vielen Dank erstmal !
(Auch an alle anderen Mitdenker !)

Habe aber zufällig vergessen das packed wegzunehmen. (?)

Am Wochenende kann ich aber erst ausprobieren, ob die Daten auch auf dem Theodolithen funktionieren.

Mit dem packed, das denke ich schon begriffen zu haben.

Also falls noch was faul ist melde ich mich hier nochmal, danke....