2017-01-27 105 views
0

記錄我定義這個包裝記錄:迭代通過與指數

TReplayData = packed record 
    GameMode : Byte; 
    VersionReplayCreation : Integer; 
    BeatMapMD5Hash : String; 
    PlayerName : String; 
    NumberOf300s : Short; 
    NumberOf100s : Short; 
    NumberOf50s : Short; 
    NumberOfGekis : Short; 
    NumberOfKatus : Short; 
    NumberOfMisses : Short; 
    TotalScore : Integer; 
    GreatestCombo : Short; 
    Perfect : Byte; 
    ModsUsed : Integer; 
    LifeBarGraph : String; 
    TimeStamp : Long; 
    LengthInBytes : Integer; 
    ReplayData : TByteArray; 
    Unknown : Long; 
    end; 

我想填補它( /不工作):

for i := 0 to SizeOf(TReplayData) - 1 do 
    begin 
    CopyMemory(ReplayData[i], AReplayBuffer + SizeOf(ReplayData[i]), SizeOf(ReplayData[i])); 
    end; 

這顯然是行不通的。 AReplayBuffer是Char的一個數組,它由所有需要的數據(排序)組成。

我怎麼能在一個循環中填充結構/有甚至有辦法嗎?

+0

如何獲得char數組?如果你在某個地方序列化它,那麼以相同的方式反序列化它可能是一個好主意。 – DNR

回答

0

首先問題

的FreePascal的文檔:http://wiki.freepascal.org/Character_and_string_types#ShortString指出String類型可以指ShortString短或AnsiString類型,從編譯器設置({$ H}開關),取決於。

同一頁面還說,「內部,AnsiString類型的變量被視爲指針:字符串的實際內容存儲在堆中」。所以如果是這種情況,在指針變量上寫入二進制數據將導致無效指針。

解決方案:請確保您使用ShortString(對於MD5和播放器名稱,大小限制不應該是問題)。

問題二

您嘗試從ReplayData成員複製存儲到包含的ReplayData全程記錄。即使您嘗試從TReplayData的兩個不同實例複製,您也沒有足夠的空間。因此SizeOf(TReplayData)將大於SizeOf(ReplayData)

解決方法:放置ReplayData: TByteArray以外的記錄。 (N.B. TByteArray被定義爲32767字節長,導致浪費的空間,參見http://www.freepascal.org/docs-html/rtl/sysutils/tbytearray.html

+0

這個問題被標記爲「德爾福」,而不是FPC。可能有某種程度的兼容性,但情況並非總是如此 –