Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.12.2020, 14:50
West2000 West2000 вне форума
Прохожий
 
Регистрация: 08.12.2020
Сообщения: 1
Версия Delphi: Delphi 7 , 10.2
Репутация: 10
По умолчанию Неправильный Qsort

==Delphi7

Если я использую классику сортировки, то все сортируется правильно, даже если я использую массив ссылок на массив входа байтов, которые надо сортировать. То есть, если в текущем коде вот это, то сортируется правильно

while a [i] < x do i:=i+1;
while x < a [j] do j:=j-1;

Но если я меняю на простую функцию

while CmpByte (a [i], x) do i:=i+1;
while CmpByte (x, a [j]) do j:=j-1;

то все меняется, массив сортируется не полностью, есть мусор на выходе.
Испробовал все, давал адреса в функцию, смещения и прочее, все неправильно, даже если сделать вот так, то неправильно сортирует

Function CmpByte (a, b: byte): boolean;
begin
Result:= a < b;
end;

Не могу понять где косяк, в дебаге адреса передаются правильно.

Проверьте код
.................................................. ............................
procedure Qsort (l,r: longint); // Работает нормально, ошибок нет
var
i,j,x,y: longint;
begin
i:=l; j:=r;
x:=a [(l+r) shr 1];
repeat
while a[i] < x do i:=i+1;
while x < a[j] do j:=j-1;
if i<=j then begin y:=a[i]; a[i]:=a[j]; a[j]:=y; i:=i+1; j:=j-1; end;
until i>j;
if l<j then qsort( l,j);
if i<r then qsort( i,r);
end;
////////////////////////////////////////////////////////////////////////////////
function CmpByte (a, b: byte): boolean; // Не работает
begin
Result := false;
if a < b then Result := true;
// или так = if a < b then Result := true else Result := false; //Не работает
end;
////////////////////////////////////////////////////////////////////////////////
procedure Qsort2 (l,r: byte); // Не работает
var
i,j,x,y: longint;
begin
i:=l; j:=r;
x:=a [(l+r) shr 1];
repeat
while CmpByte (a [i], x) do i:=i+1;
while CmpByte (x, a[j]) do j:=j-1;
if i<=j then begin y:=a[i]; a[i]:=a[j]; a[j]:=y; i:=i+1; j:=j-1; end;
until i>j;
if l<j then qsort2( l,j);
if i<r then qsort2( i,r);
end;
============================
Проблема решена. Меня попросили выложить минимальный код, я все лишнее почистил и вдруг процедура стала работать правильно. У меня было подозрение на ошибку компилятора, именно это и подтвердилось, я создал новый проект и перенес код туда, все работает правильно.

Последний раз редактировалось West2000, 10.12.2020 в 15:56.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter