Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];

Вниз

Как отсортировать массив 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.043 c
1-1168528339
Wahnsinng
2007-01-11 18:12
2007.03.04
WebBrowser


11-1150290707
AndreyRus
2006-06-14 17:11
2007.03.04
PopUpMenu.Enabled:= false; // Bug!


15-1171207383
user_
2007-02-11 18:23
2007.03.04
Тупой вопрос про файловые системы


2-1171536281
SQL
2007-02-15 13:44
2007.03.04
Проблемма с вводом даты в Windows XP


1-1168438293
tol
2007-01-10 17:11
2007.03.04
Сотрировка страниц для печати





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский