gpt4 book ai didi

delphi - 嵌套比较器函数使用 Delphi XE3 64 位失败 TStringList.CustomSort

转载 作者:行者123 更新时间:2023-12-03 18:27:22 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Why cannot take address to a nested local function in 64 bit Delphi?

(1 个回答)


8年前关闭。




我有这个简单的代码

procedure TForm2.btn1Click(Sender: TObject);
var s : TStringList;

function compare(s : TStringList; i1, i2 : integer) : integer;
begin
result := CompareText(s[i1], s[i2]);
end;

begin
s := TStringList.Create;
try
s.add('s1');
s.add('s2');
s.add('s3');
s.CustomSort(@compare);
finally
s.free;
end;
end;

当我将其编译为 32 位时,它按预期工作,但使用 64 位时出现访问冲突。
对于函数比较中的 64 位版本, s = nil. i2 = some random value ;

如果我提取 compare,即使对于 Win64 目标,它也可以按预期工作 btn1Click 之外的函数功能。

它是 System.Classes 的错误,有什么办法可以修复吗?

最佳答案

本地嵌套函数不应该被分配给过程变量(特别是不应该作为过程变量参数传递)。

http://docwiki.embarcadero.com/RADStudio/XE4/en/Procedural_Types - 搜索“嵌套”。

原因很简单:本地函数应该安排它们的堆栈,以便它们可以访问所有上层函数(父级)堆栈帧。但是,当这些函数在没有事先调用其父函数的所有链的情况下跳转到这些函数时,这些堆栈帧将不存在。而这种“出乎意料”的潜水正是将他们的地址传递给不知道这个特定调用链的高管时发生的事情。这就像在没有 VMT 链接到父类并且没有 Self 指向正确 VMT 的情况下调用某些对象的虚拟方法。

错误不是这样的代码在win64中不起作用。

错误是它甚至可以在 win32 或 win64 中编译。

当 Delphi 修复这个 bug 时,它不会再编译这样的代码,除非你使 compare一个适当的全局函数应该是。

关于delphi - 嵌套比较器函数使用 Delphi XE3 64 位失败 TStringList.CustomSort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17783302/

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