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, которая эти блоки меняет местами? В принципе и самому реализовать можно, но мот кто делал уже?


ZiRoCool   (2004-06-30 19:59:00) [1]

ламер, переменная создаётся, только ДИНАМИЧЕСКИ, под неё выделяется память


ламер   (2004-06-30 19:57:00) [2]

> ZiRoCool   (30.06.04 19:43) [36]
New(P) не создаёт никаких переменных. нет идентификатора - нет переменной.


ZiRoCool   (2004-06-30 19:43:00) [3]

Digitman, хех, ну прикольнул :)

>>p: PInteger; //это не integer !! это просто некий указатель
>>New(p);
это да, НО этот указатель то какраз и указывает на ту самую нежелательную ДОПОЛНИТЕЛЬНУЮ INTEGER ПЕРЕМЕННУЮ ;))))))))


Digitman   (2004-06-29 17:48:00) [4]


> Кастуся   (29.06.04 13:11) [23]
> короче. есть массив
> a:array[1..2] of integer;
> a[1]:=1;
> a[2]:=2;
> - очень сильно упрощаю.
> необходимо после некоторых махинаций сделать,
> чтобы
> a[1]:=2;
> a[2]:=1;
> !!!
> не используя дополнительной integer переменной


нет уж, давай-ка не упрощай ... каждая конкретная задача имеет одно или более строго определенных решений, универсальных решений нет и быть не может

конкретно в данномслучае решение может выглядеть, например, так

p: PInteger; //это не integer !! это просто некий указатель

New(p);
p^ := a[1];
a[1] := a[2];
a[2] := p^;
Dispose(p);

как видишь, это полностью удовлетворяет условию "дополнительной integer переменной" полностью работоспособно


SammIk   (2004-06-29 17:47:00) [5]

2[Кастуся] Делаем выводы, если не дорогая, значит дешовая..
Ну это так, размышление.....
А чем тебе указатели не нравятся?


Кастуся   (2004-06-29 16:44:00) [6]


> ZiRoCool   (29.06.04 14:43) [25]
> >>var
> >>p:pointer;
> >>begin
> >>p:=@a[1];
> >>@a[1]:=@a[2];
> >>@a[2]:=p;
> >>end;
> ну это конечно тупость :)

так конечно. я же и говорю ,что этот код не катит!
а если есть масси из строк? как тама поменять местаим строки?


ZiRoCool   (2004-06-29 15:19:00) [7]

Mim1, на счёт выделения ты может и прав, НО
попробуй поменять местами две переменные типа байт со значениями 255 и 1 :), как нистранно появится ошибка переполнения.
но есть более гибкий алгоритм, применимый к любым данным, любой длинны, не зависимо от самих данных:
a = a xor b;
b = a xor b;
a = a xor b;

и усё! и описаная мною выше ситуация, как в сказке не вызвала ошибку :)


Mim1   (2004-06-29 15:12:00) [8]


> [30] ZiRoCool   (29.06.04 15:03)

Думается что при существующем алгоритме думать совсем не надо, учитывая еще и то что у чтроки практически недосигаемый верхний барьер. Однако для строк такой код приведет к неявному выделению памяти.


ZiRoCool   (2004-06-29 15:03:00) [9]

Mim1, а если немного в эту проблему углубиться, можно нечто по лучче вывести, например таким же принцыпом можно поменять местами переменные типа string, тока подумать нада :)


ZiRoCool   (2004-06-29 14:49:00) [10]

Erik1, не move, а mov ;)


Mim1   (2004-06-29 14:46:00) [11]

Немного не к тему но.
Школьная задача на смекалку.
Есть две числовых переменных a = 10 и b = 20. Переменые типа байт. Как поменять значения этих переменных местами?
решение
a := a + b;
b := a - b;
a := a - a;
:)
Может вас это интересует?


ZiRoCool   (2004-06-29 14:46:00) [12]

от блин, Erik1, на 13 сек мя опередил!
НО, можно сделать даже так, чтобы не использовать ВООБЩЕ дополнительной памяти и регистров. этот же закон справедлив для ЛЮБЫХ данных(строк, чисел и т.д.). а терь мне скажи, как ты в регистр свой EAX поместиш строку типа 'HelloWorld' (указатели не предлагать!)?


ZiRoCool   (2004-06-29 14:44:00) [13]

от блин, Erik1, на 13 сек мя опередил!


ZiRoCool   (2004-06-29 14:43:00) [14]

>>var
>>p:pointer;
>>begin
>>p:=@a[1];
>>@a[1]:=@a[2];
>>@a[2]:=p;
>>end;
ну это конечно тупость :)
я лично не представляю как через указатели поменять переменные, не трогая самих переменных!

>>короче. есть массив
>>a:array[1..2] of integer;
>>a[1]:=1;
>>a[2]:=2;
ну а это осуществить просще некуда
даже
>>не используя дополнительной integer переменной!


Erik1   (2004-06-29 14:30:00) [15]

Можно на ASM использовать регистер.
Move a, EAX
Move b, a
Move EAX, b
Так подойдет? И вобще о чем спор, из темы непоятно.


Кастуся   (2004-06-29 13:11:00) [16]

короче. есть массив
a:array[1..2] of integer;
a[1]:=1;
a[2]:=2;
- очень сильно упрощаю.
необходимо после некоторых махинаций сделать,
чтобы
a[1]:=2;
a[2]:=1;
!!!
не используя дополнительной integer переменной!
что-то типа такого, только чтобы верно было:
var
p:pointer;
begin
p:=@a[1];
@a[1]:=@a[2];
@a[2]:=p;
end;


Кастуся   (2004-06-29 13:07:00) [17]


> SammIk ©   (29.06.04 11:50) [21]

пошла в ... дорогая, сама ты дорогая.

> Кастуся   (28.06.04 23:09) [11]
>
> > jack128 ©   (28.06.04 10:57) [7]
> > сам(а) будет решать
>
> сам

!!!


SammIk   (2004-06-29 11:50:00) [18]

2[18]
Вы, дорогая, путаете понятиЯ.
Указатель это переменная типа DWORD, которая указывает на область памяти, где эти ваши илежат, а не сами они.


Defunct   (2004-06-29 11:43:00) [19]

hm.. a где делся мой копирайт?


Defunct   (2004-06-29 11:42:00) [20]

Кастуся   (29.06.04 11:08) [17]
Кастуся   (29.06.04 11:11) [18]

вывод: Кастуся просто не понимает значения слова "указатель".


Страницы:   1 2

Наверх

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