Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
Вниз
PChar:=String Найти похожие ветки
← →
GTAID (2006-08-17 20:07) [0]Как присвоить String к PChar?
Хелп!
Как сделать в обратную сторону я знаю: String:=StrPas(PChar)
← →
DevilDevil © (2006-08-17 20:10) [1]Pchar := Pchar(String);
> Как присвоить
преобразовать
← →
GTAID (2006-08-17 20:29) [2]Спасибо, DevilDevil.
← →
Ketmar © (2006-08-17 20:31) [3]во-первых, достаточно s := stirng(pcharptr);
во-вторых: а память выделять, самоубийцы? %-)
← →
Чапаев © (2006-08-17 20:35) [4]> а память выделять, самоубийцы?
Флёнов, сэр!
← →
begin...end © (2006-08-17 20:36) [5]> Ketmar © (17.08.06 20:31) [3]
> во-первых, достаточно s := stirng(pcharptr);
Я бы даже сказал, что достаточно s := pcharptr.
:o)
← →
Ketmar © (2006-08-17 20:39) [6]> [4] Чапаев © (17.08.06 20:35)
поймать бы его толпой камрадов в тёмном переулке... %-)
> [5] begin...end © (17.08.06 20:36)
ну да. это уже издержки моего стиля. %-)
← →
DiamondShark © (2006-08-18 10:38) [7]А что не так с памятью? Просто помнить, что валидность такого пчара равна времени жизни строки.
← →
Ketmar © (2006-08-18 11:14) [8]> [7] DiamondShark © (18.08.06 10:38)
ты думаешь, будут помнить? сильно сомневаюсь. а то ещё полезут менять строку через указатель... или сменят символ в строке и удивятся, увидев AV... нафиг-нафиг.
← →
Ega23 © (2006-08-18 11:54) [9]Самое прикольное, когда начинаешь такую прикастовку строки к PChar делать для передачи PChar в dll.
Узнаёшь много интересного о PChar, String, их взаимодействии и т.п. :о)
← →
Ketmar © (2006-08-18 11:55) [10]> [9] Ega23 © (18.08.06 11:54)
если DLL строку не меняет -- то всё легально. %-)
← →
Ega23 © (2006-08-18 11:58) [11]
> если DLL строку не меняет -- то всё легально. %-)
А если меняет? Да ещё и callback"ом в приложение возвращает что-то?
Вот тут и сказывается вред Delphi, если подходить к нему как к бутонокидательству.
← →
Ketmar © (2006-08-18 12:01) [12]> [11] Ega23 © (18.08.06 11:58)
это не "вред Delphi", это вред лени. %-)
← →
Ega23 © (2006-08-18 12:41) [13]
> это не "вред Delphi", это вред лени. %-)
Просто Delphi вкупе с Флёновыми развращает. Не учит пониманию простых вещей.
Точнее, не простых, а основополагающих.
← →
Ketmar © (2006-08-18 13:01) [14]> [13] Ega23 © (18.08.06 12:41)
хм. а Delphi и не обязана ничему учить... %-)
← →
DevilDevil © (2006-08-18 16:19) [15]> [3]-[14]
Прямо обкакали, можно сказать.
← →
Ega23 © (2006-08-18 16:23) [16]
> Прямо обкакали, можно сказать.
Не совсем. Обкакывается иначе. Как - могу объяснить по мылу. Нефиг форум засорять физиологическими подробностями функционирования человеческого организма.
← →
DevilDevil © (2006-08-18 16:30) [17]Вы вместо флуда, объяснили бы сами человеку, какие трудности следует ожидать, что за "звери" такие: pchar и string. А то целых 15 неинформативных постов...
← →
Loginov Dmitry © (2006-08-18 16:40) [18]> Как присвоить String к PChar?
Полагаю, что уже имеется готовый буфер для копирования в него строки (иначе, зачем нужны такие пляски), причем буфер находится в другом модуле, подгруженном в одно адресное пространство с вашей программой. Известна также длина этого буфера. Тогда можно так сделать:
Len := Min(S, BufSize - 1);
Move(S[1], PCharBuf^, Len);
PCharBuf[Len] := #0;
← →
DevilDevil © (2006-08-18 16:45) [19]> иначе, зачем нужны такие пляски
например в такой ситуации:procedure ShowError(Text : string);
begin
MessageBox(GetActiveWindow, pchar(Text), "Error:", MB_ICONERROR);
end;
← →
Ega23 © (2006-08-18 16:54) [20]
> DevilDevil © (18.08.06 16:45) [19]
Если бы внимательно почитал "неинформативные посты", то ты бы понял, что простое преобразование прокатывает далеко не всегда.
← →
Loginov Dmitry © (2006-08-18 17:09) [21]> например в такой ситуации:
>
> procedure ShowError(Text : string);
> begin
> MessageBox(GetActiveWindow, pchar(Text), "Error:", MB_ICONERROR)
> ;
> end;
Это совершенно иная ситуация. Тут нет никакого присваивания String к PChar. Здесь просто-напросто приведение типов.
← →
DevilDevil © (2006-08-18 17:24) [22]> Loginov Dmitry © (18.08.06 17:09) [21]
procedure ShowError(Text : string);
var
Mes : pchar;
begin
Mes := pchar(Text);
MessageBox(GetActiveWindow, Mes, "Error:", MB_ICONERROR)
end;
Дело в том что автор топика скорее всего только начал изучать Дельфи; он даже вопрос грамотно задать не смог. Да и не удивительно: он же и не думал, что с преобразованиями pchar <--> string может быть столько мороки
> Ega23 © (18.08.06 16:54) [20]
Если бы не забивал мозги извращениями типа PVariant^, то может ты бы понял, что в БОЛЬШИНСТВЕ Api-вызовов как раз "простое преобразование" и требуется
P.S. нет, ну привяжутся же к ерунде, вместо того чтобы реально человеку советом помочь. Вот дотошные...
← →
MBo © (2006-08-18 17:27) [23]http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1206
← →
DevilDevil © (2006-08-18 17:33) [24]> MBo © (18.08.06 17:27) [23]
Единствеенный рулёзный человек!
← →
Ketmar © (2006-08-18 18:24) [25]> [22] DevilDevil © (18.08.06 17:24)
если автор "не думал", то это только его проблемы. авось в дальнейшем будет сначала думать.
← →
Loginov Dmitry © (2006-08-18 18:33) [26]> Mes := pchar(Text);
Хе... Автоматически выделяется память и в нее копируется содержимое Text.
А зачем так сделали, не ясно. Вдруг я хочу в Mes просто запомнить указатель на данные строки Text.
Сколько же еще фичей зашито в PChar?
← →
Loginov Dmitry © (2006-08-18 18:37) [27]Причем, если будет так
procedure ShowError(const Text : string);
то копирования не будет, а присвоится только указатель, как и ожидалось.
← →
Loginov Dmitry © (2006-08-18 18:43) [28]За одно проверил, что если строка передается так
procedure ShowError(Text : string);
то происходит предварительно создание копии данной строки.
Поэтому директирой const пренебрегать не следует.
← →
begin...end © (2006-08-18 18:46) [29]> DevilDevil © (18.08.06 16:19) [15]
А можно пояснить, кого, например, я обкакал в посте [5]? Аж интересно.
> Loginov Dmitry © (18.08.06 18:33) [26]
> Хе... Автоматически выделяется память и в нее копируется
> содержимое Text.
Что за чушь?
← →
Loginov Dmitry © (2006-08-18 18:49) [30]> Что за чушь?
Проверь. Удивишься!
← →
Ega23 © (2006-08-18 18:50) [31]
> Если бы не забивал мозги извращениями типа PVariant^, то
> может ты бы понял, что в БОЛЬШИНСТВЕ Api-вызовов как раз
> "простое преобразование" и требуется
Между прочим, посмотрев на остальные подобные функции, пришёл к выводу, что передачей значения через var-параметр там не обойтись.
Так что - мимо тазика, любезный.
← →
begin...end © (2006-08-18 18:53) [32]> Loginov Dmitry © (18.08.06 18:49) [30]
Проверил. Не удивился. Как я и ожидал, при выполнении указанного присваивания выделения памяти не происходит. Что я делаю не так?
← →
Ketmar © (2006-08-18 18:56) [33]> [29] begin...end © (18.08.06 18:46)
вполне верю. в свое время в каких-то Delphi смотрел на код, генерируемый SetCOnsoleTitle(PChar(s)) -- был очень удивлён. делалась копия s, это передавалось винеж, потом копию убивали.
← →
Ketmar © (2006-08-18 18:56) [34]пардон за опечатки. тяпница, вечер...
← →
Loginov Dmitry © (2006-08-18 20:16) [35]> Что я делаю не так?
А что делаешь так?
В общем, посмотри такой код:
procedure ShowError(Text : string);
var
Mes : pchar;
begin
Mes := pchar(Text);
ShowMessageFmt("Память строки: %d Новый буфер: %d",
[Integer(@Text[1]), Integer(Mes)]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
begin
S := "BlaBlaBla";
ShowError(S);
end;
Здесь память для Mes выделяется. Выделяется она даже в случае использования директивы var. Исключение - const
← →
begin...end © (2006-08-18 20:45) [36]> Loginov Dmitry © (18.08.06 20:16) [35]
> [Integer(@Text[1]), Integer(Mes)]
Заменить на [Integer(Text), Integer(Mes)]. Скомпилировать. Запустить. Удивиться.
← →
Loginov Dmitry © (2006-08-18 21:10) [37]После [23] я уже ничему ни удивляюсь. Фишку усек вроде: при обращении к Text[1] происходит вызов UniqueString.
MBo, за ссылку спасиба! Можно век программить, и не узнать таких подробностей о строках.
← →
begin...end © (2006-08-18 21:20) [38]> Loginov Dmitry © (18.08.06 21:10) [37]
> После [23] я уже ничему ни удивляюсь.
А я, ей-богу, не перестаю удивляться. Людям, которые в форуме для начинающих выдают свои заблуждения за истину.
← →
Loginov Dmitry © (2006-08-18 21:20) [39]Тогда получается, что мое утверждение в [28] верно только при обращении Integer(@Text[1]). То есть при Integer(Text) копирование строки при передаче в подпрограмму не выполняется, увеличивается только счетчик ссылок.
← →
DiamondShark © (2006-08-18 22:27) [40]
> Ega23 © (18.08.06 18:50) [31]
Не верю.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.049 c