如果SortCompareObjects函数总是返回相同的结果(而不是变化的结果,例如使用CompareText),那么获取EAccessViolation的确切原因是什么?
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 发布于 2013-02-20 01:29:33
比较排序算法在假设排序函数具有某些属性的情况下访问数组中的元素。具体来说,
<
排序算法保证,如果您的函数遵守规则,它将对数组进行排序。否则,如果你不遵守规则,所有的赌注都会被取消。什么事都有可能发生。如果您遇到运行时错误,请不要惊讶。根据我的经验,最常见的情况是堆栈溢出,但访问冲突也是可能的。
发布于 2013-02-20 04:20:08
假设排序算法是顺序的……
这是一个非常错误的假设,你不需要做出这样的假设。首先,除非您使用的是Delphi的试用版,否则您可以看到源代码;它是QucikSort,而不是其他任何东西。第二个问题是,什么是“顺序”排序算法?我从来没听说过!
为了直接回答您的问题,下面是Delphi使用的QuickSort算法的代码片段。SCompare是您提供的函数,它总是返回1
while SCompare(SortList^[J], P) > 0 do
Dec(J);因为1总是大于0,所以循环永远不会停止。只有当SortList^[j]产生访问冲突时,它才会停止,这迟早会发生。
https://stackoverflow.com/questions/14963053
复制相似问题