Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.05;
Скачать: CL | DM;

Вниз

строки   Найти похожие ветки 

 
РоманВитов   (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
3-14415
Step[B.M.]
2002-11-16 01:25
2002.12.05
Firebird... какие плюсы или какие минусы ???


1-14480
MainKaif
2002-11-22 23:39
2002.12.05
Как сделать программу которая будет работать в фоновом режиме


3-14436
kombat
2002-11-13 18:20
2002.12.05
Какой то непонятный этот Jet


3-14412
Назаров Евгений
2002-11-16 11:38
2002.12.05
Увеличить значение генератора


1-14678
Dristl
2002-11-25 21:56
2002.12.05
Подскажите, пожалуйста, можно ли запретить выделение в TEdit?