首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >始终具有相同结果的SortCompareFunction将创建EAccessViolation

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

Stack Overflow用户
提问于 2013-02-20 00:56:00
回答 2查看 127关注 0票数 2

如果SortCompareObjects函数总是返回相同的结果(而不是变化的结果,例如使用CompareText),那么获取EAccessViolation的确切原因是什么?

代码语言:javascript
复制
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 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-20 01:29:33

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

  • If f(x,y)<0 then f(y,x)>0
  • If f(x,y)=0 then f(y,x)=0
  • If f(x,y)<0 f(y,z)<0
    • f(x,z)<0
    • f(x,x)=0

    <

    • >f29>

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

票数 4
EN

Stack Overflow用户

发布于 2013-02-20 04:20:08

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

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

为了直接回答您的问题,下面是Delphi使用的QuickSort算法的代码片段。SCompare是您提供的函数,它总是返回1

代码语言:javascript
复制
  while SCompare(SortList^[J], P) > 0 do
    Dec(J);

因为1总是大于0,所以循环永远不会停止。只有当SortList^[j]产生访问冲突时,它才会停止,这迟早会发生。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14963053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档