2016-09-28 57 views
-1

我需要在Delphi中複製packed recordTByteDynArray將打包記錄複製到delphi(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)); 

這似乎不能正確複製。有人可以指出我是否做錯了什麼?

+0

目前還不清楚你實際上要怎樣做。你想達到什麼目的?最簡單的方法是直接將記錄作爲線性內存塊直接移動到數組中,但由於不清楚您的意圖是什麼,很難看出該解決方案是否可行。 –

回答

2

如果你想複製記錄字節數組,然後你的代碼是做相反的。請注意0​​的參數。其第一個參數是來源,其第二個參數是目的地。這比其他的API不同,像memcpy()CopyMemory()

試試這個:

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)); 

或者,您可以複製一氣呵成整個記錄:

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

這一說,如果你需要做每場複製,我建議讓編譯器爲你計算字段偏移量,例如:

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; 
相關問題