kbmmemtable sorton 报错 : List index out of bounds
同一数据集,不同的排序条件,有的可以,但某一条件,却能100%重现报错。
procedure TkbmIndex.InternalFastQuickSort(const L,R:Integer); var I,J:integer; P:PkbmRecord; begin if ((R-L)>4) then // if ((R-L)>0) then begin I:=(R+L) div 2; if CompareRecords(FIndexFieldList,PkbmRecord(FReferences[L]),PkbmRecord(FReferences[I]),true,false)>0 then InternalSwap(L,I); if CompareRecords(FIndexFieldList,PkbmRecord(FReferences[L]),PkbmRecord(FReferences[R]),true,false)>0 then InternalSwap(L,R); if CompareRecords(FIndexFieldList,PkbmRecord(FReferences[I]),PkbmRecord(FReferences[R]),true,false)>0 then InternalSwap(I,R); J:=R-1; InternalSwap(I,J); I:=L; P:=PkbmRecord(FReferences[J]); while true do begin Inc(I); Dec(J); while CompareRecords(FIndexFieldList,PkbmRecord(FReferences[I]),P,true,false) < 0 do Inc(I); while CompareRecords(FIndexFieldList,PkbmRecord(FReferences[J]),P,true,false) > 0 do Dec(J); if (J<I) then break; InternalSwap(I,J); end; InternalSwap(I,R-1); InternalFastQuickSort(L,J); InternalFastQuickSort(I+1,R); end; end;
反复跟代码,发现在 kbmMemTable.PAS中,当J减至0时,FReferences[J] 下标越界
试改为FIndexFieldList.Count>0前判断条件却未解决,说明并非是递减原因,改为大于J,未报错,是否有问题,待应用中再关注。
procedure TkbmIndex.InternalFastQuickSort(const L,R:Integer); var I,J:integer; P:PkbmRecord; begin if ((R-L)>4) then // if ((R-L)>0) then begin I:=(R+L) div 2; if CompareRecords(FIndexFieldList,PkbmRecord(FReferences[L]),PkbmRecord(FReferences[I]),true,false)>0 then InternalSwap(L,I); if CompareRecords(FIndexFieldList,PkbmRecord(FReferences[L]),PkbmRecord(FReferences[R]),true,false)>0 then InternalSwap(L,R); if CompareRecords(FIndexFieldList,PkbmRecord(FReferences[I]),PkbmRecord(FReferences[R]),true,false)>0 then InternalSwap(I,R); J:=R-1; InternalSwap(I,J); I:=L; P:=PkbmRecord(FReferences[J]); while true do begin Inc(I); Dec(J); while CompareRecords(FIndexFieldList,PkbmRecord(FReferences[I]),P,true,false) < 0 do Inc(I); while (FIndexFieldList.Count>J )and (CompareRecords(FIndexFieldList,PkbmRecord(FReferences[J]),P,true,false) > 0) do Dec(J); if (J<I) then break; InternalSwap(I,J); end; InternalSwap(I,R-1); InternalFastQuickSort(L,J); InternalFastQuickSort(I+1,R); end; end;