gpt4 book ai didi

delphi - 在 Win64 上对旧 Contnrs.TObjectList 进行排序

转载 作者:行者123 更新时间:2023-12-03 15:08:49 27 4
gpt4 key购买 nike

我们有一些旧的类使用 Contnrs.TObjectList ,并且在某些情况下,使用自定义比较函数对这些列表进行排序,使用如下所示的内容:

procedure TMyClass.SortItems;

function CompareFunction(Item1, Item2: Pointer): Integer;
begin
Result := TSomeItem(Item1).Value - TSomeItem(Item2).Value;
end;

begin
Sort(@CompareFunction);
end;

这段代码在针对 Win32 编译时没有问题,但是当我们针对 Win64 编译它时,我们发现排序不再起作用。

我使用 Generics.Collections.TObjectList<T> 修复了其中一些问题相反,并修改 CompareFunction以及它的名字。所以我的猜测是,这与 CompareFunction 的方式有关。通过在其前面加上 @ 来调用运算符,据我理解,指的是函数的地址。

为什么上面的代码在 Win64 上不起作用,修复它的正确方法是什么?

最佳答案

TObjectList.Sort() 需要一个独立的回调函数。

内部函数共享其父函数的堆栈帧(因此它可以访问父函数的局部变量和参数)。所以你不能使用内部函数作为回调。由于函数在 32 位中的工作方式存在侥幸,您在 32 位中侥幸逃脱了惩罚。但这在 64 位中不再适用。

您需要将 CompareFunction() 单独移出,例如:

function CompareFunction(Item1, Item2: Pointer): Integer;
begin
Result := TSomeItem(Item1).Value - TSomeItem(Item2).Value;
end;

procedure TMyClass.SortItems;
begin
Sort(@CompareFunction);
end;

这适用于 32 位和 64 位。

关于delphi - 在 Win64 上对旧 Contnrs.TObjectList 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47447826/

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