Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сортировка в 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]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо