2

如果函数总是返回相同的结果(而不是变化的结果,例如 with ),SortCompareObjects函数获得 an的确切原因是什么?EAccessViolationCompareText

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 
4

2 回答 2

4

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

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

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

于 2013-02-19T17:29:33.393 回答
1

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

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

为了直接回答您的问题,这里是QuickSortDelphi 使用的算法的代码片段。SCompare是您提供的功能,始终返回的功能1

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

由于1总是大于零,因此该循环永远不会停止它只会在产生访问冲突时停止SortList^[j],而且这迟早会发生。

于 2013-02-19T20:20:07.710 回答