Autor Beitrag
J.Borchert
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 150

WIN10
XE2 Professional
BeitragVerfasst: Di 18.11.03 21:45 
Habe ein Programm in Pascal (DOS) gehabt, das meine Datensätze in eine Datei schreibt. Hat prima funktioniert.
Formatbeispiel:
ausblenden 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:

ausblenden 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.... :?:
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 150

WIN10
XE2 Professional
BeitragVerfasst: 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.

www.delphi-forum.de/...hlight=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:
ausblenden 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.......
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Do 20.11.03 22:58 
dann teste doch mal mit der compiler-direktive {$A2} das alignment auf 16bit zu stellen! Selbstredend ohne packed:

ausblenden 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.

_________________
mfg.
mâximôv
Sven
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314


D6 Ent, K3 Pro (patched)
BeitragVerfasst: Fr 21.11.03 09:21 
Könnte es sein, daß das alte TP-Programm 6-Byte Reals verwendet?

_________________
MDK 9.1, Kernel 2.4.21, KDE 3.1 Kylix 3 Pro (patched), nutze aber auch Windows
J.Borchert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 150

WIN10
XE2 Professional
BeitragVerfasst: 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....