Главная страница
    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.47 MB
Время: 0.01 c
3-1133552167
Сергей А.
2005-12-02 22:36
2006.02.05
Фильтрация в DBGrid


1-1136283831
sergg
2006-01-03 13:23
2006.02.05
Запрет редактирования элементов Items в Combobox


2-1137705603
Змей
2006-01-20 00:20
2006.02.05
русские или английские буквы в строке?


2-1137407275
-matrix-
2006-01-16 13:27
2006.02.05
Парочка глупых вопросов


1-1135933959
_RusLAN
2005-12-30 12:12
2006.02.05
Ошибка при передаче формулы в EXCEL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский