如果SortCompareObjects
函数始终返回相同的结果(而不是更改结果,例如使用EAccessViolation
),CompareText
函数获取function SortCompareObjects(Item1, Item2: Pointer): Integer;
begin
Result := 1; // EAccessViolation
// Result := CompareText(...); // No EAccessViolation
end;
MyObjectList: System.Contnrs.TObjectList;
MyObjectList := System.Contnrs.TObjectList.Create;
for i := 0 to x do
MyObjectList.Add(AObject);
MyObjectList.Sort(@SortCompareObjects); // EAccesViolation
的确切原因是什么?
{{1}}
答案 0 :(得分:4)
比较排序算法在假设sort函数具有某些属性的情况下访问数组中的元素。具体地,
排序算法保证在函数服从规则时对数组进行排序。否则,如果您不遵守规则,所有投注都将被取消。什么事情都可能发生。如果遇到运行时错误,请不要感到惊讶。根据我的经验,最常见的是堆栈溢出,但访问违规也是合理的。
答案 1 :(得分:1)
假设排序算法是顺序的......
这是一个非常错误的假设,一个你不需要做的。首先,除非您使用的是Delphi的试用版,否则您可以看到源代码;这是QucikSort,而不是其他任何东西。第二个问题是,什么是“顺序”排序算法?我从来没有听说过一个!
要直接回答您的问题,这里是Delphi使用的QuickSort
算法的代码片段。 SCompare
是您提供的功能,始终重新提供的功能1
while SCompare(SortList^[J], P) > 0 do
Dec(J);
由于1
总是格式化为零,因此该循环永远不会停止。它仅在SortList^[j]
生成访问冲突时停止,并且迟早会发生。