SortCompareFunction с всегда одинаковым результатом создает EAccessViolation

Какова точная причина 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 

2 ответа

Решение

Алгоритм сортировки сравнения обращается к элементам в массиве в предположении, что функция сортировки имеет определенные свойства. В частности,

  • Если 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
  • Р (х, х) = 0

Алгоритм сортировки гарантирует, что он будет сортировать массив, если ваша функция подчиняется правилам. В противном случае, если вы не подчиняетесь правилам, все ставки отменены. Может произойти все, что угодно. Не удивляйтесь, если вы столкнетесь с ошибками во время выполнения. По моему опыту, чаще всего наблюдается переполнение стека, но также возможно и нарушение прав доступа.

При условии, что алгоритм сортировки является последовательным...

Это очень неправильное предположение, которое вам не нужно делать. Прежде всего, если вы не используете пробную версию Delphi, вы можете увидеть исходный код; Это QucikSort, а не что-нибудь еще. Вторая проблема в том, что такое "последовательный" алгоритм сортировки? Я никогда не слышал об этом!

Чтобы ответить на ваш вопрос напрямую, вот фрагмент кода из QuickSort алгоритм, используемый Delphi. SCompare та функция, которую вы предоставили, та, которая всегда возвращается 1

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

поскольку 1 всегда больше нуля, этот цикл никогда не остановится. Останавливается только когда SortList^[j] генерирует нарушение прав доступа, и это должно произойти рано или поздно.

Другие вопросы по тегам