Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.05;
Скачать: CL | DM;

Вниз

Не могу правильно отсортировать массив. Помогите.   Найти похожие ветки 

 
SergP.   (2006-01-13 12:14) [0]

У кого есть время, посмотрите, а то уже несколько часов не могу понять в чем дело:

Имеется массив записей. Нужно отсортировать его по сначала по accnum, затем по batch
Но получается почему-то что по accnum он сортируется, а по batch (в пределах одинаковых accnum) почему-то не сортируется
Не могу понять в чем дело...

Описание записи и массива:

type
 histp = record
    tag:integer;
    case Boolean of
    True:  (expression:int64);
    False: (batch,accnum: Cardinal);
 end;
...
 phist: array of histp;


Процедура сортировки

procedure QuickSort(var A: array of histp; iLo, iHi: Integer);
 var
   Lo, Hi:integer;
   Mid:int64;
   T:histp;
 begin
   Lo := iLo;
   Hi := iHi;
   Mid := A[(Lo + Hi) div 2].expression;
   repeat
     while A[Lo].expression < Mid do Inc(Lo);
     while A[Hi].expression > Mid do Dec(Hi);
     if Lo <= Hi then
     begin
       T := A[Lo];
       A[Lo] := A[Hi];
       A[Hi] := T;
       Inc(Lo);
       Dec(Hi);
     end;
   until Lo > Hi;
   if Hi > iLo then QuickSort(A, iLo, Hi);
   if Lo < iHi then QuickSort(A, Lo, iHi);
end;


 
Desdechado ©   (2006-01-13 12:26) [1]

странный ты, сортируешь по expression? а хочешь, чтоб сортировалось по запчастям
если б они у тебя в другом порядке в типе описаны были (acc,bat), то тогда понятно было бы, а так...


 
Igorek ©   (2006-01-13 12:46) [2]


> Нужно отсортировать его по сначала по accnum, затем по batch

Функция сравнения:
firstGreater(el1, el2)
if el1.accnum < el2.accnum then
result := false
else
if el1.accnum > el2.accnum then
result := true
else
if el1.batch > el2.batch then
result := true
else
result := false;


 
Sandman29 ©   (2006-01-13 12:49) [3]

if el1.accnum < el2.accnum then
result := false
else
if el1.accnum > el2.accnum then
result := true
else
result := el1.batch > el2.batch;


 
SergP.   (2006-01-13 12:51) [4]


> странный ты, сортируешь по expression? а хочешь, чтоб сортировалось
> по запчастям
> если б они у тебя в другом порядке в типе описаны были (acc,
> bat), то тогда понятно было бы, а так...


Но ведь результат оказывается в общем отсортированным по accnum, но в перелах одного acnum batch"и неотсортированы...

А насчет порядка - так ведь accnum должен быть в старших 4-х байтах expression, а batch в младших... следовательно в описании сначала идет batch, а потом accnum


 
SergP.   (2006-01-13 12:59) [5]


> Igorek ©   (13.01.06 12:46) [2]
> Sandman29 ©   (13.01.06 12:49) [3]


Сначала хотел было так и сделать, но потом захотелось "с извращениями".
А теперь очень хочется понять почему "с извращениями" не заработало как положенно...


 
Sandman29 ©   (2006-01-13 13:03) [6]

SergP.   (13.01.06 12:59) [5]

Я не спец по структурам int64.
Присвойте двум записям одинаковые accnum, но разные batch.
А потом посмотрите под отладчиком или
ShowMessage(intToStr(a1.expression));ShowMessage(intToStr(a2.expression));


 
SergP.   (2006-01-13 13:18) [7]


> Sandman29 ©   (13.01.06 13:03) [6]


Обнаружил такую вещь:

Размер записи

type
 histp = record
    tag:integer;
    case Boolean of
    True:  (expression:int64);
    False: (batch,accnum: Cardinal);
 end;


равен 16 байтам... а ведь по идее должно быть 12:

    tag:integer;                            // 4 байта
    case Boolean of
    True:  (expression:int64);          // либо 8 байт
    False: (batch,accnum: Cardinal);// либо 2*4 байта

Но ИМХО 4 байта accnum почему-то являются младшими байтами expression, а batch вообще не входит в expression.
Что за фигня такая?
Или я что-то не так понял в вариантных записях?


 
SergP.   (2006-01-13 13:26) [8]

ЁПРСТ... Понял свою ошибку....

Нужно было не record а packed record


 
SergP.   (2006-01-13 13:32) [9]

ЁПРСТ... Понял свою ошибку....

Нужно было не record а packed record


 
Sandman29 ©   (2006-01-13 14:03) [10]

SergP.   (13.01.06 13:26) [8]

А мне все равно непонятно, почему была ошибка.


 
SergP.   (2006-01-13 16:15) [11]


> А мне все равно непонятно, почему была ошибка.


Память в записи по другому распределялась...
Я заполнял в массиве batch и accnum, а сортировал по expression


 
Sandman29 ©   (2006-01-13 16:22) [12]

SergP.   (13.01.06 16:15) [11]

То есть было так:
tag 4 байта, пустые 4 байта, expression 8 байт
и
tag 4 байта, batch 4 байта, accnum 4, пустые 4.

Соответственно, поле batch не использовалось при обращении к expression?



Страницы: 1 вся ветка

Текущий архив: 2006.02.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.042 c
3-1133785755
Kerk
2005-12-05 15:29
2006.02.05
Excel. Чувствую, что торможу


5-1111410444
wicked
2005-03-21 16:07
2006.02.05
Перенос компонент BCB -> Delphi...


2-1136883428
Pazitron_Brain
2006-01-10 11:57
2006.02.05
Как в Делфи 7 установить Клиент и Сервер сокеты


15-1137501483
Yeg
2006-01-17 15:38
2006.02.05
Запуск программы...


4-1132756932
rusgl
2005-11-23 17:42
2006.02.05
Сохранить содержимое IE в BMP файл.