Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-14578
Comp
2002-11-27 12:06
2002.12.05
Case <...> of <...>


14-14817
OlegS Astana
2002-11-16 09:01
2002.12.05
Работа с градусами


14-14768
Weare
2002-11-14 18:47
2002.12.05
Мои старые вопросы


1-14585
volph7777
2002-11-27 13:25
2002.12.05
ownerdraw listbox


4-14887
Semenyak
2002-10-23 13:21
2002.12.05
Комбинация клавиш в компоненте WebBrowser





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский