gpt4 book ai didi

TList 中的 Delphi XE8 错误,需要解决方法

转载 作者:行者123 更新时间:2023-12-03 14:32:48 24 4
gpt4 key购买 nike

升级到 XE8 后,我们的一些项目开始破坏数据。看起来像是 TList 实现中的一个错误。

program XE8Bug1;
{$APPTYPE CONSOLE}

uses
System.SysUtils, Generics.Collections;

type
TRecord = record
A: Integer;
B: Int64;
end;

var
FRecord: TRecord;
FList: TList<TRecord>;

begin
FList := TList<TRecord>.Create;
FRecord.A := 1;
FList.Insert(0, FRecord);
FRecord.A := 3;
FList.Insert(1, FRecord);
FRecord.A := 2;
FList.Insert(1, FRecord);
Writeln(IntToStr(FList[0].A) + IntToStr(FList[1].A) + IntToStr(FList[2].A));

end.

此代码在 XE7 及之前版本中打印“123”(应该如此),但在 XE8 中它打印“120”。也许有人知道这个问题的快速修复方法?

更新:非官方修复是 here

最佳答案

我发现现在TList<T>.Insert方法调用TListHelper.InternalInsertX取决于数据大小,就我而言:

procedure TListHelper.InternalInsertN(AIndex: Integer; const Value);
var
ElemSize: Integer;
begin
CheckInsertRange(AIndex);

InternalGrowCheck(FCount + 1);
ElemSize := ElSize;
if AIndex <> FCount then
Move(PByte(FItems^)[AIndex * ElemSize], PByte(FItems^)[(AIndex * ElemSize) + 1], (FCount - AIndex) * ElemSize);
Move(Value, PByte(FItems^)[AIndex * ElemSize], ElemSize);
Inc(FCount);
FNotify(Value, cnAdded);
end;

我在第一个 Move 中看到了问题称呼。目的地应该是:

PByte(FItems^)[(AIndex + 1) * ElemSize]

不是

PByte(FItems^)[(AIndex * ElemSize) + 1]

啊啊!

最后,我在项目中使用了 Delphi XE7 中的 System.Generics.Defaults.pas 和 System.Generics.Collections.pas 单元,现在一切都按预期工作。

更新:据我所知,RTL 不受影响,因为它不使用 TList<T>.Insert对于 SizeOf > 8 的 T (或者也许我错过了一些东西?)

关于TList<T> 中的 Delphi XE8 错误,需要解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29906723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com