2017-01-27 101 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。可能有某种程度的兼容性,但情况并非总是如此 –