Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SwapMemory [D5, Win95/98]


Страницы:   1 2

Кастуся ©   (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
молодец ;-)

> В принципе и самому реализовать можно, но мот кто делал
> уже?
я делал.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо