Autor Beitrag
chrissivo
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 130

WIN XP, WIN 2000, WIN MCE, WIN 98
D5 Pers
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



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

WIN XP, WIN 2000, WIN MCE, WIN 98
D5 Pers
BeitragVerfasst: 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
ausblenden 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 23.07.05 14:13 
ausblenden Delphi-Quelltext
1:
{$MINENUMSIZE 1}					


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

WIN XP, WIN 2000, WIN MCE, WIN 98
D5 Pers
BeitragVerfasst: 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 :wink:
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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 120
Erhaltene Danke: 18


D2005 Personal
BeitragVerfasst: So 24.07.05 17:09 
user profile iconBenBE hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
{$MINENUMSIZE 1}					

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.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  MyRecord: record
    a: Byte;
    b: Longint;
  end; // 8 Bytes groß! 1 Byte + 3 unbenutzte Füllbytes + 1 Longint
  MyPackedRecord: packed record
    a: Byte;
    b: Longint;
  end; // 5 Bytes groß 1 Byte + 1 Longint

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

WIN XP, WIN 2000, WIN MCE, WIN 98
D5 Pers
BeitragVerfasst: So 24.07.05 17:47 
:dance: :dance: :dance2: :dunce: :think: :beer: :beer: :dance2: :dance2: :dance: :dunce: :mrgreen: :rofl: :rofl:
:flehan: :flehan: :flehan: :flehan: :flehan: :flehan: :flehan: SMO

Kurz: Problem glöst! Tausend Dank!

_________________
"... was ich noch zu sagen hätte dauert eine Zigarette, und ein letztes Glas im Steh'n..."