具有始终相同结果的SortCompareFunction会创建EAccessViolation

时间:2013-02-19 16:56:00

标签: delphi delphi-xe2 sortcomparefunction

如果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}}

2 个答案:

答案 0 :(得分:4)

比较排序算法在假设sort函数具有某些属性的情况下访问数组中的元素。具体地,

  • 如果f(x,y)<0则f(y,x)> 0
  • 如果f(x,y)= 0则f(y,x)= 0
  • 如果f(x,y)<0且f(y,z)<0则f(x,z)<0
  • F(X,X)= 0

排序算法保证在函数服从规则时对数组进行排序。否则,如果您不遵守规则,所有投注都将被取消。什么事情都可能发生。如果遇到运行时错误,请不要感到惊讶。根据我的经验,最常见的是堆栈溢出,但访问违规也是合理的。

答案 1 :(得分:1)

  

假设排序算法是顺序的......

这是一个非常错误的假设,一个你不需要做的。首先,除非您使用的是Delphi的试用版,否则您可以看到源代码;这是QucikSort,而不是其他任何东西。第二个问题是,什么是“顺序”排序算法?我从来没有听说过一个!

要直接回答您的问题,这里是Delphi使用的QuickSort算法的代码片段。 SCompare是您提供的功能,始终重新提供的功能1

  while SCompare(SortList^[J], P) > 0 do
    Dec(J);

由于1 总是格式化为零,因此该循环永远不会停止。它仅在SortList^[j]生成访问冲突时停止,并且迟早会发生。