2

関数が常に同じ結果を返す場合(たとえば、で結果を変更するのではなく)、SortCompareObjects関数がを取得する正確な理由は何ですか?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であり、他には何もありません。2番目の問題は、「シーケンシャル」ソートアルゴリズムとは何ですか?聞いたことがない!

質問に直接答えるためにQuickSort、Delphiで使用されているアルゴリズムのコードの一部を次に示します。SCompareあなたが提供した関数であり、常に1

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

1常におろし金であり、その後ゼロであるため、そのループは決して停止しません。アクセス違反が発生した場合にのみ停止しSortList^[j]、遅かれ早かれ発生するはずです。

于 2013-02-19T20:20:07.710 に答える