| Autor |
Beitrag |
chrissivo
      
Beiträge: 130
WIN XP, WIN 2000, WIN MCE, WIN 98
D5 Pers
|
Verfasst: Sa 23.07.05 10:53
Hallihallo,
ich habe folgendes Problem:
Ich habe Dateien, die mit einem Turbo Pascal Programm erstellt worden sind und kenne auch die Datenstruktur. Wenn ich nun unter MS Windows eine Datei mit der offensichtlich gleichen Datenstruktur erstelle, hat die mit dem Delphi Programm erstellte Datei einen um 2Byte längeren Datensatz als die mit dem TP Programm erstellte Datei.
Ansich hatte ich das Auslesen auch schon dadurch lösen können, dass ich einfach mit einem blockread unter Angabe der Länge des DOS-Datensatzes die Datei auslese. Dies versprach zunächst auch Erfolg, bis ich schließlich feststellte, dass die Mengen, die in den Dateien gespeichert waren vollkommen falsch ausgelesen wurden.
Die Mengen stehen hierbei am Ende des Datensatzes.
In einer anderen Datendatei (selbe Vorgehensweise wie oben) steht eine Menge mitten im Datensatz und aus mir unerklärlichen Gründen wird in allen künftigen Datensätzen die erste Stelle abgeschnitten. Ist beispielsweise "Auto" gespeichert, wir nun "uto" ausgelesen...
Wie kann ich nun eine DOS-Datendatei mit Delphi so auslesen, dass ich an die Originalwerte herankomme?
Für jede Hilfe bin ich dankbar
Chrissi
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Sa 23.07.05 11:14
Wer soll auf diese Frage antworten ? Wenn schon, dann gebe die Datenstruktur an. Meine Glaskugel weiß allerdings zumindest wo die 2 Byte Differenz vermutlich herkommen. integer (TP) = 2 Byte integer (Delphi)=4 Bytes. Was Compilerschalter sind, das weißt Du aber ?
_________________ Gruß
Hansa
|
|
chrissivo 
      
Beiträge: 130
WIN XP, WIN 2000, WIN MCE, WIN 98
D5 Pers
|
Verfasst: Sa 23.07.05 11:47
Die Datenstruktur ist recht komplex aber gut:
Die Datei ist ein File of records. Die ersten record-Komponenten (strings, boolean, byte) werden richtig gelesen. Die integer-Problematik ist mir bekannt, aber ein integer kommt nicht vor.
Das Problem bereitet eine Komponente
Delphi-Quelltext 1:
| array[1..4] of mengentyp mit mengentyp = set of mustertyp |
und mustertyp = (m0,m1, , m77), also ein Aufzählungstyp mit 78 Werten.
Wenn man durch
Delphi-Quelltext 1: 2: 3: 4:
| var v : mustertyp begin for v := m0 to m77 do if v in menge then ausgabe ord(v) end |
die Elemente der Menge ansieht, erhält man ein total anderes Ergebnis als unter DOS mit Turbo-Pascal.
Pascal: 1,2,13,15,23,24
Delphi: 7,8,65,66,77 (ein Wert weniger  )
Und nu?
Sach mal: Wie war das doch gleich mit den Compilerschaltern? Welche meintest du zu welchem Zwecke?
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 23.07.05 14:13
Delphi-Quelltext
Ansonsten:
Gibt mal:
1. vollständige Record-Definition + Alle Untertypen
2. Hexdump von zwei aufeinanderfolgenden Datensätzen
Vielleicht kann ich dann mal etwas genauer analysieren, wo Delphi hakt.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
chrissivo 
      
Beiträge: 130
WIN XP, WIN 2000, WIN MCE, WIN 98
D5 Pers
|
Verfasst: So 24.07.05 15:27
Der Compilerschalter hat's leider nicht gebracht
Das mit der Datenstruktur würde nichts groß bringen.
Zudem ist diese streng geheim
Wie schon angesprochen liegt das Problem darin, dass Delphi die Mengen, die am Ende des Datentyps liegen komplett anders ausliest als TP es tut.
Stell dir meinetwegen vor du hast eine Menge aus Characters
Delphi-Quelltext 1: 2:
| type menge : set of Char |
Und in "menge" stehen ja nun meiner Meinung nach die Boolschen Werte und nicht die Character an sich drin. Dann werden diese Werte aus irgendeinem Grund falsch ausgelesen!
Bis die Mengen ausgelesen werden, werden auch alle Mengen richtig ausgelesen.
Ein weiteres Problem könnte sein, dass nun diese "menge" auch noch in einem Array steht.
In einer anderen ebenfalls angesprochenen Datei, habe ich jedoch ebenfalls das Problem, dass ab dem Auslesen der Menge alles schief geht....
Wie komme ich nun weiter???
Viele Grüße
Chrissi
|
|
SMO
      
Beiträge: 120
Erhaltene Danke: 18
D2005 Personal
|
Verfasst: So 24.07.05 17:09
BenBE hat folgendes geschrieben: | Delphi-Quelltext |
Soweit ich weiß beinflusst das nur die Größe von Enumeration-Variablen, nicht jedoch von Set-Variablen. MINENUMSIZE 1 ist außerdem der Standardwert.
Sets sind unabhängig davon zwischen 1 und 32 Bytes groß, je nachdem wieviel Elemente sie haben (maximal 256).
chrissivo, kennst du eigentlich das packed Schlüsselwort? Vielleicht liegt dein Problem ja daran.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| var MyRecord: record a: Byte; b: Longint; end; MyPackedRecord: packed record a: Byte; b: Longint; end; |
Der Delphi-Compiler richtet die Felder eines Records nach bestimmten Kriterien aus, um die Zugriffsgeschwindigkeit des Prozessors zu optimieren. So kann es kommen, dass ein Record mehr Bytes belegt als die Summe seiner Felder. Mit packed kann man das verhindern.
Teste also mal, ob das der Grund für dein Problem ist.
|
|
chrissivo 
      
Beiträge: 130
WIN XP, WIN 2000, WIN MCE, WIN 98
D5 Pers
|
Verfasst: So 24.07.05 17:47
_________________ "... was ich noch zu sagen hätte dauert eine Zigarette, und ein letztes Glas im Steh'n..."
|
|
|