Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1151498384
Serjio77
2006-06-28 16:39
2006.09.10
Выгрузка из файла xml для чайника...


3-1152171333
Maverick
2006-07-06 11:35
2006.09.10
TADOQuery+output параметры


2-1156081436
ronyn
2006-08-20 17:43
2006.09.10
Filter


15-1155466218
Andy BitOff
2006-08-13 14:50
2006.09.10
Windows в 85 году


2-1155730262
Evlahov
2006-08-16 16:11
2006.09.10
SQL-запрос





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский