![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SwapMemory [D5, Win95/98]
Кастуся © (2004-06-27 23:06:00)мастаки! недавно узнал, что есть функция CopyMemory? Может есть подобная SwapMemory, которая эти блоки меняет местами? В принципе и самому реализовать можно, но мот кто делал уже?
Кастуся (2004-06-29 11:11:00) [21]
> Всего хорошего, но оптимальныи вариант,для большинства задач,
> менять указатели. Скорость возрастает огого^^^^^
ну так поменяйте! Надо, чтобы
> var
> i1: Integer = 100;
> i2: Integer = 200;
а после некоторых махинаций i1 и i2 содержали 200 и 100 соответственно
Кастуся (2004-06-29 11:08:00) [22]
> Sandman25 © (29.06.04 09:49) [15]
> [14] Кастуся (29.06.04 09:46)
>
> i1: PInteger :)
нет:
> var
> i1: Integer = 100;
> i2: Integer = 200;
>
> ...
> var
> p1, p2: PInteger;
SammIk (2004-06-29 10:06:00) [23]2[10]
С чего ты взял?
А так быстрее?
xor ecx,ecx
rep1:
mov eax,mem1[eax+ecx*4]
mov mem2[edx+ecx*4],eax
inc ecx
jmp rep1;
:))))
Всего хорошего, но оптимальныи вариант,для большинства задач,
менять указатели. Скорость возрастает огого^^^^^
Sandman25 (2004-06-29 09:49:00) [24][14] Кастуся (29.06.04 09:46)
i1: PInteger :)
Кастуся (2004-06-29 09:46:00) [25]нет надо, чтобы именно i1 и i2 после обмена содержали 200 и 100 соответственно, а не p1 и p2!!!
Игорь Шевченко (2004-06-28 23:27:00) [26]Я, если честно, не понимаю, зачем и что надо менять местами. Если содержимое двух областей памяти, на которые что-то указывает, пусть даже по всех программе, то есть классический способ обмена через третью область, равную по величине. Но в любом случае лкчше оперировать указателями, и не разбрасывать их по всей программе, а держать в одном месте. :)
jack128 (2004-06-28 23:22:00) [27]
> думаешь мен-ер памяти Delphi "перекрыв-ся указ-ли" может
> "производить"? только если они самопальные)
> проверка не нужна
именно.
> Вперед. Действуй. Вот тебе два integer'а поменяй местами
> указатели на их "содержимое". У меня что-то не получается!
? а в чем проблема?
var
i1: Integer = 100;
i2: Integer = 200;
procedure TForm1.Button1Click(Sender: TObject);
var
p1, p2: PInteger;
P: PInteger;
begin
p1 := @i1; p2 := @i2;
ShowMessage(Format('i1 = %d, i2 = %d', [p1^, p2^]));
p := p1; p1 := p2; p2 := p;
ShowMessage(Format('i1 = %d, i2 = %d', [p1^, p2^]));
end;
Кастуся (2004-06-28 23:09:00) [28]
> Ломброзо © (28.06.04 00:53) [2]
> Интересно, что проще - Магомета к горе привести или гору
> к Магомету? Если есть два задействованных кусочка памяти,
> значит, есть и два указателя на неё? Может, указатели местами
> поменять?
Вперед. Действуй. Вот тебе два integer'а поменяй местами указатели на их "содержимое". У меня что-то не получается!
> jack128 © (28.06.04 10:57) [7]
> сам(а) будет решать
сам
Тимохов (2004-06-28 11:57:00) [29]зачем пользоваться movememory: если мне не изменяет память move работает быстрее (опять же если не ошибаюсь).
КаПиБаРа (2004-06-28 11:26:00) [30]Проверка нужна, но Exception генерировать не надо. Можно копировать перекрывающиеся блоки без проблем.
default (2004-06-28 11:02:00) [31]jack128 © (28.06.04 10:57) [7]
думаешь мен-ер памяти Delphi "перекрыв-ся указ-ли" может "производить"?только если они самопальные)
проверка не нужна
jack128 (2004-06-28 10:57:00) [32]
> Кастуся (28.06.04 10:34) [5]
> ну это очень тупо, см. [2] и [4]
смотря как и где ;-) Давайте соизмерять усилия которые мы прилагаем для решения задачи с важностью задачи ;-) Так мудро как ИШ про овощи мне не сказать :-)
Чтобы сделать как [4] может потребоваться всю прогу переписать.. А может и нет. Тут Кастуся сам(а) будет решать..
> Ну, огрехи будут?
в начале тест на перекрывающие области
if abs(Integer(b1) - Integer(b2)) < l then
raise Exception.Create('Блоки памяти перекрываются');
ЗЫ и старайся не использовать идентификатор 'l' - с единицей сливается..
default (2004-06-28 10:40:00) [33]Кастуся (28.06.04 10:34) [5]
ну это очень тупо, см. [2] и [4]
Кастуся (2004-06-28 10:34:00) [34]Ну, огрехи будут?
procedure SwapMemory(b1,b2:pointer;l:Cardinal);
var
p:pointer;
begin
getmem(p,l);
MoveMemory(p,b1,l);
MoveMemory(b1,b2,l);
MoveMemory(b2,p,l);
freemem(p,l);
end;
Mim1 (2004-06-28 03:13:00) [35]
> [3] jack128 © (28.06.04 01:13)
>
> > Может, указатели местами поменять?
> не всегда. Если это ЕДИНСТВЕННЫЕ указатели на эту область
> памяти, то да.. А если таких указателей по программе раскиданно
> вагон и маленькая тележка, то тяжко это будет...
Можно сделать чтобы вагон указателей указывали на указатель указывающий на данные.
Каламбурчик. :)
jack128 (2004-06-28 01:13:00) [36]
> Может, указатели местами поменять?
не всегда. Если это ЕДИНСТВЕННЫЕ указатели на эту область памяти, то да.. А если таких указателей по программе раскиданно вагон и маленькая тележка, то тяжко это будет...
Ломброзо (2004-06-28 00:53:00) [37]Интересно, что проще - Магомета к горе привести или гору к Магомету? Если есть два задействованных кусочка памяти, значит, есть и два указателя на неё? Может, указатели местами поменять?
jack128 (2004-06-27 23:14:00) [38]
> недавно узнал, что есть функция CopyMemory
молодец ;-)
> В принципе и самому реализовать можно, но мот кто делал
> уже?
я делал.