Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизСортировка в 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.034 c