![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SwapMemory [D5, Win95/98]
Кастуся © (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]
вывод: Кастуся просто не понимает значения слова "указатель".