Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.26;
Скачать: CL | DM;

Вниз

Сортировка в TList   Найти похожие ветки 

 
Erik1 ©   (2004-12-09 12:46) [0]

Создал наследник от TList в нем делаю сортировку после загрузки значений. Код:
function SortCompare(Item1, Item2: Pointer): Integer;
begin
 Result := 0;
 if TDataSet(Item1).Tag < TDataSet(Item2).Tag then
   Result := -1
 else
   Result := 1;
end;

procedure TDataSets.Full;
begin
 Clear;
 TBaseForm(fOwner).ForDataSet(SaveDataSet);
 EmptyTrunc;
 Sort(SortCompare);
end;

procedure TDataSets.SaveDataSet(Sender: TObject);
begin
 Add(Sender);
end;

У меня возникает ошибка вовремя отработки функции сортировки, передается неправильный указатель, что можно сделать? SortCompare сначала получает правильные указатель на 5 вызове в нее передается неправльный указатель = 12$.


 
TUser ©   (2004-12-09 12:51) [1]

Где-то напутал с указателями. Кода мало, сказать ничего нельзя, кроме того, что обычно находить такие баги трудно, но потом они оказфываются очнь простыми.


 
Александр Иванов ©   (2004-12-09 12:53) [2]

Sort(@SortCompare);


 
TUser ©   (2004-12-09 12:55) [3]


> Александр Иванов ©   (09.12.04 12:53) [2]

TListSortCompare = function (Item1, Item2: Pointer): Integer;
...
procedure Sort(Compare: TListSortCompare);

передавать надо функцию и никаких собак


 
Erik1 ©   (2004-12-09 12:57) [4]

Так я проверил их перед сортировкой, их всего 3 и все правельные.


 
Александр Иванов ©   (2004-12-09 12:59) [5]

Странно.

Этот кусок из Help:

procedure TForm1.Button1Click(Sender: TObject);
begin
 List1.Sort(@CompareText);
end;


 
Александр Иванов ©   (2004-12-09 13:00) [6]

Странно.

Этот кусок из Help:

procedure TForm1.Button1Click(Sender: TObject);
begin
 List1.Sort(@CompareText);
end;

Я давно не использовал сравнение в TList, поэтому "выдернул" из справки.


 
MBo ©   (2004-12-09 13:07) [7]

между прочим, у тебя некорректная логика в функции сравнения - она никогда не возвратит 0.


 
Erik1 ©   (2004-12-09 13:09) [8]

Кажется понял в чем дело в procedure QuickSort
while SCompare(SortList^[J], P) > 0 do
 Dec(J);
J становится равным -1 значит неправильные значения возвращаю.


 
MBo ©   (2004-12-09 13:10) [9]

>Александр Иванов ©   (09.12.04 13:00) [6]
можно и так, и так.


 
Digitman ©   (2004-12-09 13:16) [10]


> передается неправильный указатель, что можно сделать?


занести в список правильные указатели


> на 5 вызове


> их всего 3


нестыковочка ... откуда 5 вызовов при 3-х элементах списка и при алгоритме сортировки Квиксорт ?


 
Erik1 ©   (2004-12-09 13:18) [11]

Вопревых всех благодарю, проблема решена.

To Digitman
Все очень просто некоректный алгоритм сравнения, я никогда невозвращал 0, как справедливо заметил MBo. Вот и результат.


 
Digitman ©   (2004-12-09 13:35) [12]


> Erik1 ©   (09.12.04 13:18) [11]


я, честно говоря, не смотрел на тело твоей ф-ции сравнения, но по идее, если она некорректна на предмет возврата кода равенства, ты в какой-то момент при сортировке д.б. получить исключение Index out of bounds, а не некорректный указатель


 
begin...end ©   (2004-12-09 13:42) [13]

> Erik1 ©   (09.12.04 12:46)

> function SortCompare(Item1, Item2: Pointer): Integer;
> begin
>  Result := 0;
>  if TDataSet(Item1).Tag < TDataSet(Item2).Tag then
>    Result := -1
>  else
>    Result := 1;
> end


function SortCompare(Item1, Item2: Pointer): Integer;
begin
 Result := CompareValue(TDataSet(Item1).Tag, TDataSet(Item2).Tag)
end


 
DiamondShark ©   (2004-12-09 17:07) [14]


> Digitman ©   (09.12.04 13:35) [12]
> я, честно говоря, не смотрел на тело твоей ф-ции сравнения

Но, тем не менее, смело ломанулся советовать.



Страницы: 1 вся ветка

Текущий архив: 2004.12.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.066 c
8-1096363662
BALU1111
2004-09-28 13:27
2004.12.26
Построение поверхностей второго порядка в трехмерном пространстве


11-1082955456
Viman
2004-04-26 08:57
2004.12.26
bug в Thread


3-1101660393
midavik
2004-11-28 19:46
2004.12.26
Запись через параметр значение null в поле типа integer


14-1102364424
Cheater
2004-12-06 23:20
2004.12.26
Вопросы по экзаменам.


14-1102606894
Alekc
2004-12-09 18:41
2004.12.26
Описание .net