Главная страница
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.6 c
4-1100180548
sirsergio
2004-11-11 16:42
2004.12.26
OnKeyPress и сообщения


6-1097733021
Dr. Genius
2004-10-14 09:50
2004.12.26
TDriveType, dtFixed, dtNetWork


14-1102058586
КаПиБаРа
2004-12-03 10:23
2004.12.26
Есть ссылки на расписание поездов из Самары в сторону Челябинска?


4-1099156393
TankMan
2004-10-30 21:13
2004.12.26
Как получить права администратора?


1-1102868076
TTreeNode
2004-12-12 19:14
2004.12.26
Как в TTreeView добавить своё property для каждой его TTreeNode ?