Текущий архив: 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.47 MB
Время: 0.01 c