2016-09-28 4 views
-1

デルファイのpacked recordTByteDynArrayをコピーする必要があります。デルファイ(10シアトル)のパックドレコードをTByteDynArrayにコピー

PMyRec = ^TMyRec; 
TMyRec = packed record 
    Header: THeaderRec; 
    Timestamp: TTimeStamp; // time of event 
    PLoc: TLocationRec; 
    A: word; 
end; 

以下は、そのためのコードスニペットです。

xxx: TByteDynArray; 
    m_arr : TMyRec; 

    SetLength(xxx,sizeof(TMyRec)); 

    offset := offset + sizeof(THeaderRec); 
    System.Move(xxx[offset], m_arr.Timestamp ,sizeof(TTimeStamp)); 

    offset := offset + sizeof(TTimeStamp); 
    System.Move(xxx[offset], m_arr.PLoc,sizeof(TLocationRec)); 

これはどういうわけか、正しくコピーしていないようです。私が何か間違っていると誰かが指摘できますか?あなたはバイト配列を TOからレコードをコピーするために欠けている場合は

+0

をそれはあなたが実際に何をしようとして不明です。あなたは何を達成しようとしていますか?最も単純な方法は、レコードをメモリの線形ブロックとして直接アレイに移動することですが、そのソリューションが機能するかどうかはあなたの意図がはっきりしないので分かりません。 –

答えて

2

、その後、あなたのコードは、反対のことをやっています。 System.Move()のパラメータに注意してください。その最初のパラメータはソースで、その2番目のパラメータはの宛先です。そうは言って

System.Move(m_arr, xxx[0], sizeof(TMyRec)); 

offset := 0; 
System.Move(m_arr.Header, xxx[offset], sizeof(THeaderRec)); 

Inc(offset, sizeof(THeaderRec)); 
System.Move(m_arr.Timestamp, xxx[offset], sizeof(TTimeStamp)); 

Inc(offset, sizeof(TTimeStamp)); 
System.Move(m_arr.PLoc, xxx[offset], sizeof(TLocationRec)); 

Inc(offset, sizeof(TLocationRec)); 
System.Move(m_arr.A, xxx[offset], sizeof(Word)); 

それとも、あなたは一度にレコード全体をコピーすることができます。これは、これを試してみてくださいなど

memcpy()のように、CopyMemory()他のAPIとは異なっていますフィールドごとのコピーを行う必要がある場合、コンパイラにフィールドオフセットを計算させることをお勧めします。例:

offset := Integer(@PMyRec(nil).Header); 
System.Move(m_arr.Header, xxx[offset], sizeof(THeaderRec)); 

offset := Integer(@PMyRec(nil).Timestamp); 
System.Move(m_arr.Timestamp, xxx[offset], sizeof(TTimeStamp)); 

offset := Integer(@PMyRec(nil).PLoc); 
System.Move(m_arr.PLoc, xxx[offset], sizeof(TLocationRec)); 

offset := Integer(@PMyRec(nil).A); 
System.Move(m_arr.A, xxx[offset], sizeof(Word)); 

またはそれ以上の場合は、単にMove()を使用しないでください。代わりに、例えば、割り当てられたバイト配列をキャスト型と標準フィールドの割り当てを使用することができます。

PMyRec(xxx)^.Header := m_arr.Header; 
PMyRec(xxx)^.Timestamp := m_arr.Timestamp; 
PMyRec(xxx)^.PLoc := m_arr.PLoc; 
PMyRec(xxx)^.A := m_arr.A; 

あるいは、レコード全体をコピーするには:

PMyRec(xxx)^ := m_arr; 
関連する問題