Главная страница
    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]

Не верю.


 
DevilDevil ©   (2006-08-22 15:18) [41]

А мне вот интересно следующее:

Если объявить динамический массив строк, потом периодически изменять его размерность, утечка памяти будет?


 
Anatoly Podgoretsky ©   (2006-08-22 15:27) [42]

DiamondShark ©   (18.08.06 10:38) [7]
Короче, до времени ее изменения.


 
Anatoly Podgoretsky ©   (2006-08-22 15:29) [43]

Loginov Dmitry ©   (18.08.06 17:09) [21]
Я бы поостерегся говорить о приведении по отношению к PChar(Text) - это совсем не так.


 
Anatoly Podgoretsky ©   (2006-08-22 15:30) [44]

Loginov Dmitry ©   (18.08.06 18:33) [26]
Это вообще бред.


 
Anatoly Podgoretsky ©   (2006-08-22 15:32) [45]

DevilDevil ©   (22.08.06 15:18) [41]
С чего бы.


 
Ega23 ©   (2006-08-22 16:05) [46]


> DiamondShark ©   (18.08.06 22:27) [40]
>
>
> > Ega23 ©   (18.08.06 18:50) [31]
>
> Не верю.
>


Всё просто. Это диалог изменения свойств объекта. Создаётся динамически. Изменения "принимаются" по нажатию кнопки.

 TLookupComboPropertyFrame = class(TFrame, IPropertyFrame)
   DBLookupCombobox: TDBLookupComboboxEh;
   lbText: TLabel;
   adsData: TADODataSet;
   dsData: TDataSource;
 private
   FTarget: PVariant;
   FDebug: Boolean;
   { Private declarations }
 public
   class function init(tgt: PVariant; text : string;dlg : TPropertiesForm) : TLookupComboPropertyFrame;

   procedure refreshData; // Called to bring data from object to controls.
   procedure applyData;   // Called to bring data from controls to object.
   procedure rejectData;  // called to cancel changes.
   function  get_frame : TFrame;

   property frame  : TFrame  read get_frame;
   property target : PVariant    read FTarget write FTarget;
   property Debug : Boolean Read FDebug Write FDebug;
 end;

implementation

{$R *.DFM}

{ TLookupComboPropertyFrame }

//*****************************************************************************

procedure TLookupComboPropertyFrame.applyData;
begin
 FTarget^:=DBLookupCombobox.KeyValue;
 //FTarget^:=adsData.FieldByName(DBLookupCombobox.KeyField).AsInteger;
end;

//*****************************************************************************

function TLookupComboPropertyFrame.get_frame: TFrame;
begin
 Result:=Self;
end;

//*****************************************************************************

class function TLookupComboPropertyFrame.init(tgt: PVariant; text: string;
 dlg: TPropertiesForm): TLookupComboPropertyFrame;
var
 frm : TLookupComboPropertyFrame;
begin
 frm      := TLookupComboPropertyFrame.Create(dlg);
 frm.Name := "C" + IntToStr(Random(2000000000));

 frm.FTarget         := tgt;
 frm.lbText.Caption  := text;

 dlg.addFrame(frm);

 Result := frm;
end;

//*****************************************************************************

procedure TLookupComboPropertyFrame.refreshData;
begin
 try
   DBLookupCombobox.KeyValue:=FTarget^;
 except

 end;
end;

//*****************************************************************************

procedure TLookupComboPropertyFrame.rejectData;
begin
 refreshData;
end;

//*****************************************************************************


FTarget - и есть адрес, по которому надо внести изменения. А, соответственно, на init я этот адрес и задаю.


 
DevilDevil ©   (2006-08-22 18:32) [47]


> Anatoly Podgoretsky ©   (22.08.06 15:32) [45]
>
> DevilDevil ©   (22.08.06 15:18) [41]
> С чего бы.


Ну смотри, у меня есть динамический массив строк, размерности 3. Каждый элемент - условно говоря указатель на какую-то область динамической памяти:
StrArr[0] := "STR 0";
StrArr[1] := "STR 1";
StrArr[2] := "STR 2";


Если я уменьшу размерность этого массива, то освободится только память под указатель, а "деструктора" строки не поизойдёт; поэтому и утечка памяти... Длят того чтобы этого не происходило, я должен перед уменьшением размерности массива "обнулить" освобождаемые строки:
StrArr[1] := "";
StrArr[2] := "";
SetLength(StrArr, 1);


Я не прав?


 
Anatoly Podgoretsky ©   (2006-08-22 18:48) [48]

Еще раз повторяю с чего бы, у тебя ошибка где то в другом месте.


 
begin...end ©   (2006-08-22 20:31) [49]

> DevilDevil ©   (22.08.06 18:32) [47]

> Если я уменьшу размерность этого массива...

В процессе выполнения программы Вы не можете изменить размерность массива (ни статического, ни динамического) -- она постоянна, и в данном случае равна 1. То, о чём Вы говорите, называется размером, а не размерностью.

> то освободится только память под указатель, а "деструктора"
> строки не поизойдёт

Вы ошибаетесь. При уменьшении размера массива, состоящего из длинных строк, счётчик ссылок удаляемых из массива строк уменьшится на 1, и если после этого окажется, что он равен 0, то память, занимаемая телами этих строк, освободится автоматически. Такова особенность типов с управляемым временем жизни, к которым относятся и длинные строки (AnsiString).

Если бы речь шла о массиве простых указателей, содержащих адреса участков памяти, выделенных Вами с помощью, скажем, GetMem, то Вы были бы правы -- перед уменьшением размера массива следовало бы вызвать FreeMem для каждого удаляемого элемента.

P.S. Так как насчёт [29]? За словеса отвечать будем, или как?


 
ronyn   (2006-08-23 00:17) [50]


> Просто Delphi вкупе с Флёновыми развращает. Не учит пониманию
> простых вещей.
> Точнее, не простых, а основополагающих.

Почему бы это. Кто что имеет против Флёнова?


 
Злой   (2006-08-23 00:18) [51]

> begin...end ©   (22.08.06 20:31) [49]
Такова особенность типов с управляемым временем жизни, к которым относятся и длинные строки (AnsiString).


Благодарю. А где можно поподробнее почитать о типах с управляемым временем жизни?

> P.S. Так как насчёт [29]? За словеса отвечать будем, или как?

begin...end ©   (18.08.06 18:46) [29]
> DevilDevil ©   (18.08.06 16:19) [15]
А можно пояснить, кого, например, я обкакал в посте [5]? Аж интересно.


Естественно, к Вам моя реплика не имеет ни какого отношения


 
DevilDevil ©   (2006-08-23 00:19) [52]

Это я, - забыл ник сменить



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.08 c
2-1156236491
misha_gr
2006-08-22 12:48
2006.09.10
Директивы компилятора


2-1156253429
AlexanderMS
2006-08-22 17:30
2006.09.10
Зачем нужен const?


3-1152217283
sholom
2006-07-07 00:21
2006.09.10
Это mysql не позволяет или комп?


15-1155735870
StriderMan
2006-08-16 17:44
2006.09.10
Windows Vista


15-1155794431
Alx_
2006-08-17 10:00
2006.09.10
Genuine Advantage Notifications





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