当我在比较中有大量数字时,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的值在Integer限制之内时,此排序工作正常,但当值超过Integer限制时,BUT不起作用!它会在PArrayInd中生成一组未排序的数据。
这是怎么回事?
答案 0 :(得分:9)
问题是溢出之一。实数值溢出整数类型。
compare函数用于返回负数以表示小于,正于。表示大于和零表示相等。使用算术是导致问题的原因,并导致溢出。而是使用比较运算符。
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
这导致溢出。通常,始终使用比较运算符来实现比较功能。