2016-07-01 5 views
0

Ich habe ein altes Projekt zu refactor. Dies ist Delphi5 Projekt in 32bit.lesen von 32bit record in 64bit projekt

Das neue Projekt muss 64-Bit-Architektur verwenden.

Eigentlich ist mein Punkt, altes Datenformat aus einer Datei zu lesen.

Die Datei enthält Datensätze mit vielen Feldern.

Im Moment habe ich Probleme mit dynamischen Array von ganzen Zahlen.

TCObject = record 
    Name:string[205]; 
    roomindex:array of integer; 

SizeOf (roomindex) = 4 in altem Projekt und SizeOf (roomindex) = 8 in meinem 64-Bit-Projekt.

So habe ich ein Problem Daten aus der Datei als

stream.Read(buf, SizeOf(TCObject)) 

Könnten Sie mir Art und Weise zeigen, zu lesen, wie Delphi zu sagen Größe zu verwenden = 4? :)

Vielen Dank.

UPDATE: wie David sagte, es ist besser, echten Code zur Verfügung zu stellen, der Daten liest.

procedure ParseCDatabase(pBuff: Pointer; pSize: Integer); 
var 
    curr:^TCObject; 
    i, n: Integer; 
    curri:^Integer; 
begin 
    curri:= pBuff; 
    n:=curri^; 
    Inc(curri); 
    curr:=pointer(curri); 
    for i:=0 to n-1 do 
    begin 
    if Curr^.Name<>'' then 
    begin 
     COAddObject(); 
     curro:=pointer(curr); 
     curro.RoomIndex:=integer(nil); 
     Fcodb[af][ai]:=curr^; 
     SetLength(Fcodb[af][ai].RoomIndex,0); 
     Inc(ai); 
    end; 
    inc(curr); 
    end; 
end; 

I-Code zur Verfügung stellen wie ... So sehen wir hier, dass roomindex gelesen wird, sondern auf 0 So zurückgesetzt actualy wir es gar nicht brauchen. 8 jetzt

Problem ist gesamte Daten über Zeiger, weil Größe von Punkt zu dynamischem Array zu lesen, aber nicht 4.

+5

Sie sagen uns nicht die ganze Geschichte hier. Ihr Code, den Sie beanspruchen, funktioniert in Delphi 5 nicht. Sie können Zeiger nicht direkt in einer Datei speichern, da sie nur eine Bedeutung im Ausführungsprozess haben. 'stream.Read (buf, SizeOf (TCObject))' hat in keiner Version von Delphi funktioniert. Sie müssen tiefer graben und herausfinden, was das Programm wirklich tut, wenn diese Aufzeichnung fortbesteht. Falscher Code, der keinen Bezug zum echten Code hat, ist nicht hilfreich. Sie haben diese Frage viel zu früh gestellt. Sie müssen wirklich knutschen und das Problem zuerst verstehen. Erwarten Sie hier keine Abkürzungen. –

+0

Hmm, ich würde nicht von hier aus starten! Aber du hast keine Wahl, oder? Wahrscheinlich ist der Ansatz von Dsm gesund. –

+0

@DavidHeffernanIch habe meine Frage mit echtem Code aus dem alten Projekt aktualisiert. – mad

Antwort

2

roomindex ist ein Zeiger, der in einem 32-Bit-Projekt 4 Bytes ist und in einem 64-Bit-Projekt ist 8 Bytes. Sie können das nicht realistisch ändern. Ich bin erstaunt, dass Sie einen Zeiger auf eine Datei speichern und laden Sie sie zurück. Wie kann das funktionieren, wenn der Zeiger nicht verworfen wird? Vorausgesetzt, dass Sie den Zeiger speichern, aber es verwerfen Sie können dies tun:

TCObjectOldFormat = record 
    Name:string[205]; 
    roomindex: Int32; 
end; 

TCObject = record 
    Name:string[205]; 
    roomindex:array of integer; 
end; 

var 
    AObject : TCObject; 
    AObjectOldFormat :TCObjectOldFormat; 
... 
stream.ReadBuffer(AObjectOldFormat, SizeOf(TCObjectOldFormat)); 
AObject.Name := AOldObject.Name; 

offensichtlich können Sie an Ihre Bedürfnisse mit buf anzupassen. Dies zeigt nur deutlicher die Idee.

+0

"Ich bin erstaunt, dass Sie einen Zeiger auf eine Datei speichern." Es ist nicht mein Code und ich mag es nicht. Es ist kritisch altmodisch mit prozeduralem Stil und so weiter. Meine Aufgabe ist es, sie umzuwandeln, um lesbaren Code zu erhalten. – mad

+0

Ihre Antwort wird geschätzt. Vielen Dank für die Hilfe. – mad

+0

Ihre Begrüßung. Ich meinte keine Kritik an dir, nur den Code. – Dsm