Форум: "Основная";
Текущий архив: 2002.12.05;
Скачать: [xml.tar.bz2];
Внизстроки Найти похожие ветки
← →
РоманВитов (2002-11-26 22:06) [0]Подскажите
Как поменять местами 2 строки
← →
TTCustomDelphiMaster (2002-11-26 22:09) [1]Так же как и 2 числа. Через временную переменную.
← →
SottNick (2002-11-27 07:21) [2]а как было бы хорошо, имей мы процедуру, меняющую только указатели...
← →
Anatoly Podgoretsky (2002-11-27 08:08) [3]Так оно и работает, а как ты представляешь замену указателей без дополнительной переменной, асм вставки не рассматриваем
← →
SottNick (2002-11-27 08:13) [4]2 Anatoly Podgoretsky
я представляю не замену, а обмен ... указателями, а не значениями переменных
естественно через временную переменную типа указатель
это возможно?
дай демку
← →
Alx2 (2002-11-27 08:56) [5]>Anatoly Podgoretsky © (27.11.02 08:08)
>а как ты представляешь замену указателей без дополнительной
>переменной, асм вставки не рассматриваем
Вот так, например:
Integer(S1) := Integer(S1) - Integer(S2);
Integer(S2) := Integer(S1) + Integer(S2);
Integer(S1) := Integer(S2) - Integer(S1);
← →
Alx2 (2002-11-27 08:57) [6]>Alx2 © (27.11.02 08:56)
Да, забыл сказать, что
Var S1,S2 : String;
← →
Юрий Зотов (2002-11-27 09:11) [7]> SottNick
Длинные строки - это указатели и есть. Оператор S1 := S2 копирует не тело строки, а ее адрес. Так что происходит именно то, о чем Вы говорите.
> Alx2
А Вы попробуйте. Не уверен, но есть подозрение, что сработает. Серьезно.
← →
Alx2 (2002-11-27 09:15) [8]>Юрий Зотов © (27.11.02 09:11)
Так я сначала попробовал. И написал все совершенно серьезно. И даже корректно должно работать.
← →
SottNick (2002-11-27 09:17) [9]> Юрий Зотов
не правильно
если
s1:=s2;
то
@s1<>@s2
неужель Вы и впрям так заблуждались?
← →
MBo (2002-11-27 09:21) [10]>SottNick
Не @s1, а @s1[1] (что то же самое, что и просто s1)
@s1 - адрес переменной-указателя (указатель на указатель), естественно, разные переменные лежат по разным адресам, но вот их содержимое указывает на один и тот же адрес (конечно, пока не произойдет перераспеределения памяти)
← →
Юрий Зотов (2002-11-27 09:28) [11]> SottNick © (27.11.02 09:17)
В самом деле?
А почему адрес S1 должен быть равен адресу S2? Это две разные разные переменные, и адреса у них тоже разные. С какой стати?
После присвоения S1 := S2 должны быть одинаковыми не адреса, а содержимое эти переменных. Приведите их к типу Integer или Pointer и сравните в отладчике.
← →
SottNick (2002-11-27 09:37) [12]ээээээээээ
как на разных языках
по слогам:
при операции присвоения
s1:=s2;
происходит копирование содержимого одной переменной в другую
при этом адреса (указатели памяти) строк остаются прежними
а вовсе не
>>Оператор S1 := S2 копирует не тело строки, а ее адрес
>>Юрий Зотов © (27.11.02 09:11)
то есть
при копировании строки из 255 символов в другую
происходит копирование 255 байтов
а не 4 байтов, если б мы копировали указатель памяти одной строки вместо указателя другой
← →
MBo (2002-11-27 09:41) [13]>SottNick
А вот и нет!
происходит как раз копирование 4 байт, и счетчик ссылок исходной строки увеличивается на 1.
Только если мы изменим одну из строк, произойдет реальное копирование содержимого
← →
Smithson (2002-11-27 09:49) [14]Если речь идет про ShortString (String[255]), то прав SottNick, а вот если речь идет о нормальных строках Delphi(не Pascal, а официального их названия я не помню), то это динамические объекты с управляемым временем жизни (вспомни автоконструкторы и деструкторы в С++), но физически переменная S: String будет именно указателем на блок памяти. И более того, при копировании строки S1 := S2 копируется адрес на этот блок памяти и увеличивается его внутрений счетчик ссылок. А вот если одну из строк начать изменять, то обнаружится, что счетчик ссылок у нее больше одного и вот тогда будет произведено копирование данных и уменьшение счетчика ссылок в строке-оригинале. Сделано в общем толково, но неочевидно и не слишком быстро.
← →
Юрий Зотов (2002-11-27 09:53) [15]> SottNick © (27.11.02 09:37)
Вы неправы. Копилятор Delphi строит работу с длинными строками вовсе не так, как Вы думаете. При присвоении строк копируются именно четыре байта адреса и более ничего.
← →
SottNick (2002-11-27 10:49) [16]Короче, я не знаю.
Вероятно, с длинными стрингами вы правы.
var
s1,s2,s3:string;
begin
s1:="абвгдйка";
s2:="ёпрст";
s3:=s1;
s1:=s2;
s2:=s3;
showmessage(inttostr(integer(@s1))+#13+inttostr(integer(@s2))+#13+inttostr(integer(@s3)));
end;
Указатели идут со смещением в 4 байта, т.е. указывают вероятно на еще одни указатели
Про то, как работают длинные сртинги, я не читал.
если строку
s1,s2,s3:string;
заменить на
s1,s2,s3:string[10];
всё будет совсем иначе
короче, наверняка прав Smithson
когда я сетовал на отсутствие процедуры, обменивающей указатели, я имел в виду любые типы
что-то вроде
var
s1,s2,s3:string[10];
p:^string[10];
begin
p:=@s1;
@s1:=@s2;
@s2:=p;
end;
← →
Dmitriy Polskoy (2002-11-27 11:56) [17]
> s1,s2,s3:string[10];
При таком определении будет автоматически создана строка SortString со всеми вытекающими последствиями.
← →
Юрий Зотов (2002-11-27 14:45) [18]> SottNick © (27.11.02 10:49)
По поводу длинных/коротких строк - это очевидно и пионеру. Именно поэтому во всех своих постингах я специально указывал слово "длинный". Спорить было не о чем.
По поводу обмена указателей - работайте с динамическими переменными и все будет прекрасно обмениваться. А статические - они на то и статические, чтобы их адрес не менялся.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.05;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c