Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

PChar [D6]


Страницы:   1 2

SPeller ©   (2002-07-25 12:56:00) 

Всем доброго времени суток! Что-то я вроде бы и прочитал хелп по null-terminated string"ам, но всё-равно остались сомнения по такому вопросу: как правильно сделать так, чтобы процедура изменяла значение параметра PChar?

В примере из хелпа не надо указывать слово var для того чтобы изменить значение параметра, поэтому я объявляю свою процедуру так:

procedure MyProc(S1,S2:PChar);

Изменить надо оба параметра. Но когда я делаю в процедуре

S1:=PChar(Src);,где Src имеет тип String

компилятор выдаёт Value assigned to S1 never used и поэтому по всей видимости, вследствие оптимизации выкидывает этот код.
Как мне правильно сделать присвоение чтобы получить нужный результат?

И ещё вопрос. Почти во всех функциях по работе с PChar говорится что они не проверяют размер самой строки и делают своё дело куда придётся, но я не нашёл функцию, которая задаёт длину строки. Для String достаточно было сделать SetLength, а вот для PChar как сделать подобное? И надо ли вообще это делать? В хелпе говорится что обычное присвоение вроде S:="Hello word" автоматически делает копию текста и устанавливают указатель в начало. А если в правой части оператора присваивания стоит тоже PChar или что-то другое? Почему не нравится S1:=PChar(Src);? И как обстоит дело с высвобождением памяти, занимаемой PChar-строкой?
Вообще мне не понятен механизм, по которому осуществляется работа с PChar"ами. Как выделяется память, как освобождается, ведь это по существу просто указатель.

Прошу помощи в данном вопросе, а то в хелпе инфы по нему как кот наплакал.


SPeller   (2002-07-25 18:16:00) [21]

Всем спасибо. Какие же хелпы бестолковые в некоторых отношениях бывают!! :)


Толик   (2002-07-25 15:24:00) [22]

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


SPeller   (2002-07-25 14:09:00) [23]

Тогда почему при обычном присваивании не надо ничего самому выделять? И ещё, почему в хелповском примере для переменной Result ничего не выделяется, а идёт простое присвоение?



2 MBo © (25.07.02 13:30)

Мне надо в вызывающую программу передать изменённый параметр S1. Например я процедуре передаю "C:\WINDOWS", а она мне возвращает "C:\WINDOWS\SYSTEM". В таком вот духе. Где-то внутри процедуры я постепенно в переменной String собираю строку, которую надо вернуть, а потом возвращаю. Как если бы было
procedure (var S:string); , а в теле S:="C:\WINDOWS\SYSTEM".


Толик   (2002-07-25 13:33:00) [24]

При работе с pchar всегда следует помнить о том, что это УКАЗАТЕЛЬ на char, а значит и работать с ним надо как с указателем:
Веделям память - записываем значение ... - освобождлаем память.

теперь, что касается примера:

procedure MyProc(S1,S2:PChar);
begin
S1 := PChar(Src);
end;

В данном примере в функции MyProc создаётся КОПИЯ передаваемого значения, т.е. копируются 4 байта указателя на char. Естественно, что все изменения этого указателя будут видны только внутри этой ф-и. Для получения желаемого эффекта необходимо не переприсваивать значение адреса, хранящегося в S1, а производить запись ПО АДРЕСУ, лежащему в S1.
Для данного случая я бы посоветовал

function StrCopy(Dest: PChar; const Source: PChar): PChar;


Задание длины строки - есть выделение под неё памяти, например function StrAlloc(Size: Cardinal): PChar;
где Size - кол-во символов, без последнего "0", которым заканчиваются все строки pchar.


Skier   (2002-07-25 13:32:00) [25]

>SPeller
Можно ещё посмотреть :

StrAlloc
StrNew
StrDispose


MBo   (2002-07-25 13:30:00) [26]

про первый вопрос с приведением типов поподробнее расшифруй, что именно требуется

PChar - обыкновенный указатель, для выделения памяти надо делать, скажем, GetMem, длина такой строки определяется
только нахождением нулевого символа. Освобождение памяти соответственно Freemem.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо