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