![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сортировка в TList
Erik1 © (2004-12-09 12:46:00)Создал наследник от 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$.
DiamondShark (2004-12-09 17:07:00) [1]
> Digitman © (09.12.04 13:35) [12]
> я, честно говоря, не смотрел на тело твоей ф-ции сравнения
Но, тем не менее, смело ломанулся советовать.
begin...end (2004-12-09 13:42:00) [2]> 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
Digitman (2004-12-09 13:35:00) [3]
> Erik1 © (09.12.04 13:18) [11]
я, честно говоря, не смотрел на тело твоей ф-ции сравнения, но по идее, если она некорректна на предмет возврата кода равенства, ты в какой-то момент при сортировке д.б. получить исключение Index out of bounds, а не некорректный указатель
Erik1 (2004-12-09 13:18:00) [4]Вопревых всех благодарю, проблема решена.
To Digitman
Все очень просто некоректный алгоритм сравнения, я никогда невозвращал 0, как справедливо заметил MBo. Вот и результат.
Digitman (2004-12-09 13:16:00) [5]
> передается неправильный указатель, что можно сделать?
занести в список правильныеуказатели
> на 5 вызове
> их всего 3
нестыковочка ... откуда 5 вызовов при 3-х элементах списка и при алгоритме сортировки Квиксорт ?
MBo (2004-12-09 13:10:00) [6]>Александр Иванов © (09.12.04 13:00) [6]
можно и так, и так.
Erik1 (2004-12-09 13:09:00) [7]Кажется понял в чем дело в procedure QuickSort
while SCompare(SortList^[J], P) > 0 do
Dec(J);
J становится равным -1 значит неправильные значения возвращаю.
MBo (2004-12-09 13:07:00) [8]между прочим, у тебя некорректная логика в функции сравнения - она никогда не возвратит 0.
Александр Иванов (2004-12-09 13:00:00) [9]Странно.
Этот кусок из Help:
procedure TForm1.Button1Click(Sender: TObject);
begin
List1.Sort(@CompareText);
end;
Я давно не использовал сравнение в TList, поэтому "выдернул" из справки.
Александр Иванов (2004-12-09 12:59:00) [10]Странно.
Этот кусок из Help:
procedure TForm1.Button1Click(Sender: TObject);
begin
List1.Sort(@CompareText);
end;
Erik1 (2004-12-09 12:57:00) [11]Так я проверил их перед сортировкой, их всего 3 и все правельные.
TUser (2004-12-09 12:55:00) [12]
> Александр Иванов © (09.12.04 12:53) [2]
TListSortCompare = function (Item1, Item2: Pointer): Integer;
...
procedure Sort(Compare: TListSortCompare);
передавать надо функцию и никаких собак
Александр Иванов (2004-12-09 12:53:00) [13]Sort(@SortCompare);
TUser (2004-12-09 12:51:00) [14]Где-то напутал с указателями. Кода мало, сказать ничего нельзя, кроме того, что обычно находить такие баги трудно, но потом они оказфываются очнь простыми.