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

Вниз

Как отсортировать массив tmemorystream   Найти похожие ветки 

 
Pasha L ©   (2007-02-11 14:12) [0]

Здравствуйте. Я хочу сравнить содержимое двух tmemorystream и узнать не только, являются ли они идентичными но и какой из них больше, а какой меньше. Я не имею ввиду размер. Я имею ввиду сравнивание наподобие comparestr, где мы получаем информацию о том, какая строка больше. Как мне это сделать? (Это нужно для сортировки)

Пробовал так:
var
 s1,s2:widestring;
begin
 setlength(s1,m1.size);
 m1.read(s1,m1.size);
 setlength(s2,m2.size);
 m2.read(s2,m2.size);
 result:=ansicomparestr(s1,s2);
end;

Но после первого read s1 станивится inaccessible value, а после воторого - s2 становится. Вылезает ошибка на последней строчке: Access violation at address...


 
Loginov Dmitry ©   (2007-02-11 14:32) [1]

> Как отсортировать массив tmemorystream


А причем тут tmemorystream?


 
Pasha L ©   (2007-02-11 14:45) [2]

ну. У меня есть массив из tmemorystream. Я хочу его отсортировать. При сортировке мне нужно сравнивать элементы массива. Вот я и не знаю, как сравнить два tmemorystream.

Возникла идея загнать оба сравниваемых элемента в строки и сравнить эти строки (потому что я знаю, как сравнивать строки). Но я не могу (не умею) эти стримы не скопировать в строки.


 
OSA_   (2007-02-11 15:32) [3]


> Я не имею ввиду размер. Я имею ввиду сравнивание наподобие
> comparestr, где мы получаем информацию о том, какая строка
> больше.


И где тут логика?
И зачем нужны именно WideString?
Да и параметры в SetLength стрёмные.

Размеры tmemorystream определяются как m1.Size
А по поводу сравнения массивов сразу вспоминается строковая иснтрукция asm"а (не помню точное название).


 
Pasha L ©   (2007-02-11 17:34) [4]


> И где тут логика?

Логика в том, что любая информация представляется в виде числа, а любые числа можно сравнивать. "Больше" можно понимать как "Занимающий больше места", а можно понимать по-другому: например, 58 больше, чем 3, но занимают эти числа одно и то же количество памяти (байт).


> И зачем нужны именно WideString?

Я лишь предложил свою идею решения вопроса. WideString потому, что длина содержимого стрима может быть больше 256 символов. Я не утверждаю, что widestring - именно тот строковый тип, который нужен, но и на других (string, ansistring) - происходит та же самая ошибка.


> Да и параметры в SetLength стрёмные.

Почему стремные? Я думаю, что прежде чем скопировать из стрима содерживое в стринг, нужно зарезервировать необходимое место в памяти. (Опять же, могу ошибаться)

Вообще, мне всё равно, как будет происходить сравнивание, с помощью или без строк. Главное, чтоб работало :)


 
DiamondShark ©   (2007-02-11 19:35) [5]


> Вылезает ошибка на последней строчке: Access violation at
> address...

Паша, ты к тому что тебе пишут прислушиваешься, или тупо готовый код ждёшь?


>  m1.read(s1,m1.size);

А ведь я тебе уже намекал в спраке прочитать декларацию метода read и сопоставить это с тем, что из себя представляет строковая переменная.


> Вообще, мне всё равно, как будет происходить сравнивание,
>  с помощью или без строк. Главное, чтоб работало

Лентяй. Задачка школьная.

function ByteCompare(P1, P2: Pointer; Length: Integer): Integer; overload;
var
 PB1: PByte absolute P1;
 PB2: PByte absolute P2;
begin
 Result := 0;
 while (Length > 0) and (PB1^ = PB2^) do
 begin
   Inc(PB1);
   Inc(PB2);
   Dec(Length);
 end;
 if Length > 0 then
   if PB1^ > PB2^ then Result := 1;
   else Result := -1;
end;

function ByteCompare(P1: Pinter; Length1: Integer; P2: Pointer; Length2: Integer): Integer; overload;
begin
 Result := ByteCompare(P1, P2, Min(Length1, Length2));
 if (Result = 0) and (Length1 <> Length2) then
   if Length1 > Length2 Result := 1
   else Result := -1;
end;

использование:
ByteCompare(m1.Memory, m1.Size, m2.Memory, m2.Size)

только большая просьба: не копипасти пока не поймёшь.

[4] -- это вообще ахтунг...
:(


 
Riply ©   (2007-02-11 20:28) [6]

> [5] DiamondShark ©   (11.02.07 19:35)
А что дает такое объявление переменных (PB1: PByte absolute P1) ?


 
DiamondShark ©   (2007-02-11 20:50) [7]


> Riply ©   (11.02.07 20:28) [6]

Это значит, что PB1 не является самостоятельной переменной, а является псевдонимом для переменной P1.

Или, другими словами, переменные PB1 и P1 размещены в одной и той же области памяти.


 
Riply ©   (2007-02-11 21:18) [8]

>[7] DiamondShark ©   (11.02.07 20:50)
>переменные PB1 и P1 размещены в одной и той же области памяти
Это дает прирост скорости или что-то другое ? С какой целью мы используем
именно такое объявление ?
И, если я правильно поняла, функция ByteCompare
изменит значения, переданных ей параметров P1 и P2 ?


 
jack128 ©   (2007-02-11 22:53) [9]

Riply ©   (11.02.07 21:18) [8]
С какой целью мы используем
именно такое объявление ?


В данном случае использование absolute идентично явному приведению типов


 
Riply ©   (2007-02-12 10:12) [10]

> [9] jack128 ©   (11.02.07 22:53)
Спасибо.



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

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

Наверх




Память: 0.49 MB
Время: 0.038 c
15-1170447247
Суслик
2007-02-02 23:14
2007.03.04
Запись avi с экрана.


15-1171150402
Трей
2007-02-11 02:33
2007.03.04
Существует ли компонент математического решателя?


2-1171527285
Astronom
2007-02-15 11:14
2007.03.04
Запуск приложения в ЛВС


2-1171099188
Riply
2007-02-10 12:19
2007.03.04
Извините, немного оффтопа


1-1168700664
Nostradamus
2007-01-13 18:04
2007.03.04
Мистика с RichEdit