Сортировка проблем с TArray <Myrectype>для больших чисел - PullRequest
0 голосов
/ 30 июня 2018

В чем причина TArray.Sort<Mytype> не работает, когда в сравнении большие числа?

Мой код выглядит следующим образом (Delphiy Tokyo):

Interface

Type 
 RCInd = record
           Num              : Integer;
           Ger              : Integer;           
           Confirmed        : Boolean;
           Total            : Real;
   End;

   TArrInd = TArray<RCInd>;

   Procedure SortInd  (Var PArrayInd  : TArrInd);

Implementation  

Procedure SortInd  (Var PArrayInd  : TArrInd);    
begin
  TArray.Sort<RCInd>( PArrayInd,TComparer<RCInd>.Construct
                       ( function (Const Rec1, Rec2 : RCInd) : Integer 
                         begin
                           Result := - ( Trunc(Rec1.Total) - Trunc(Rec2.Total) );
                         end )
                       );
end;

......

Когда значения Rec1.Total и Rec2.Total находятся в пределах целых чисел, эта сортировка работает нормально, НО, когда значения превышают целочисленные пределы Процедура сортировки не работает! Он генерирует несортированный набор данных в PArrayInd.

Что здесь происходит?

1 Ответ

0 голосов
/ 30 июня 2018

Проблема в переполнении. Действительные значения переполняют целочисленный тип.

Функция сравнения предназначена для возврата отрицательного значения, чтобы указать меньше, чем положительное. Укажите больше и ноль, чтобы указать равный. Использование вами арифметики - причина вашей проблемы, которая приводит к переполнению. Вместо этого используйте операторы сравнения.

function(const Rec1, Rec2: RCInd): Integer
begin
  if Rec1.Total < Rec2.Total then
    Result := 1
  else if Rec1.Total > Rec2.Total then
    Result := -1
  else
    Result := 0;
end;

Проблема в этом вопросе заключается в попытке вписать действительное значение в целое число, но даже если у вас есть целочисленные данные, тогда арифметику не следует использовать для функций сравнения. Рассмотрим выражение

Low(Integer) - 1

Это приводит к переполнению. Как правило, всегда используйте операторы сравнения для реализации функций сравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...