2016-07-01 4 views
0

私はリファクタリングのための古いプロジェクトを持っています。 これは32ビットのDelphi5プロジェクトです。64bitプロジェクトの32bitレコードから読み込み

新しいプロジェクトでは、64ビットアーキテクチャを使用する必要があります。

実際、私の指摘はファイルから古いデータ形式を読み取ることです。

ファイルには多くのフィールドが含まれています。

現時点では、整数の動的配列に問題があります。私の64ビットのプロジェクトで古いプロジェクト と にSizeOf(roomindex)= 8で

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

にSizeOf(roomindex)= 4。

だから私はあなたは私のサイズ= 4を使用するためにデルファイを言うためにどのような方法を

stream.Read(buf, SizeOf(TCObject)) 

としてファイルからデータを読み込むための問題を示すことができていますか? :)

ありがとうございます。

UPDATE: Davidは、データを読み取る実際のコードを提供する方がよいと述べています。

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; 

であるように私は、だから、だから、actualy、我々はそれを全く必要としないroomindexが読み込まれたことがわかりますが0にリセット ...コードを提供します。ダイナミックアレイの点の大きさは8今ではなく、4

+5

あなたはここに全体の話をしているわけではありません。 Delphi 5で動作すると主張するコードは機能しません。ポインターはファイルに直接格納することはできません。なぜなら、ポインターは実行中のプロセスでのみ意味を持つからです。 'stream.Read(buf、SizeOf(TCObject))'は、どのバージョンのDelphiでも動作したことがありません。このレコードを永続させるときには、もっと深く掘り下げてプログラムが本当に何をするかを知る必要があります。実際のコードとは関係のない偽のコードを投稿することは、まったく役に立たない。あなたはこの質問をあまりに早く尋ねました。あなたは本当にナックルし、まず問題を理解する必要があります。ここでショートカットを期待しないでください。 –

+0

うーん、私はここから始まらないだろう!しかし、あなたは何も選択する必要はありません。たぶんDsmのアプローチは健全です。 –

+0

@DavidHeffernan私の質問を、古いプロジェクトの実際のコードで更新しました。 – mad

答えて

2

roomindexは、32ビットのプロジェクトに4バイトであり、64ビット・プロジェクト内のポインタ、であるので

問題は、ポインタを介して全データを読み取ることです8バイトです。それを現実的に変更することはできません。私はあなたがファイルへのポインタを保存し、それを戻すことに驚いています。ポインタが破棄されない限り、どのように動作しますか?ポインタを保存して破棄したと仮定すると、次のようになります。

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; 

明らかに、bufを使用してニーズに合わせることができます。これはアイデアをより明示的に示しています。

+0

"ファイルへのポインタを保存するのは驚きです。"それは私のコードではなく、私はそれを気に入らない。それは手続き的なスタイルなど非常に古い学校です。私の仕事は、それをリファクタリングして読みやすいコードを得ることです。 – mad

+0

あなたの答えは高く評価されます。助けてくれてありがとう。 – mad

+0

ようこそ。私はあなたの批判を意味せず、コードだけを意味しました。 – Dsm

関連する問題