IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> Как скопировать строку PChar ?
Ldnb
сообщение 11.05.2010 4:56
Сообщение #1





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Думал, что, судя по описанию, функция StrCopy делает полноценное копирование, то есть автоматически выделяет память под копию данных. Как оказалось, нет, копируется только указатель, то есть, если после копирования из буферной переменной её значение меняется, то меняется и "скопированная" строчка.
Так как же всё-таки работать с этим странным PChar?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 13.05.2010 21:12
Сообщение #2


Гость






Ты читать умеешь?
Цитата
Declaration:
function StrNew(Str: PChar): PChar;
Все, дальше можешь ничего не делать, уже будет неправильно. Ты НЕ МОЖЕШЬ вместо PChar передать String в функцию. Точка. Разговор с точки зрения компилятора - закончен. В результате функция возвращает все, что угодно, но только не правильный результат. Для конвертации Pascal-евской строки в PChar недостаточно просто написать PChar('string'), это тебе не Дельфи, в Турбо-Паскале для подобных вещей существует
Цитата
StrPCopy (function) (Strings unit)
Copies a Pascal-style string to a null-terminated string.
Declaration:
function StrPCopy(Dest: PChar; Source: String): PChar;

Remarks:
StrPCopy does not perform any length checking.
The destination buffer must have room for at least Length(Source)+1 characters.

(особенно внимательно читай ремарку!!!)

Я бы написал свою функцию, которая будет выделять память под null-terminated строку и копировать туда символы из строки Паскалевской. Тогда твой код перепишется очень просто:

uses strings;

function Convert(s: string): PChar;
var p: Pointer;
begin
GetMem(p, Length(s) + 1);
StrPCopy(PChar(p), s);
Convert := p;
end;

var
testArr: array[0 .. 1] of PChar;
begin
testArr[0] := Convert('!');
testArr[1] := Convert('abcdefgh');

StrLCat(testArr[0], StrNew(testArr[1]), StrLen(testArr[1]) + 1);
writeln(testArr[0]); { Будет выведено '!abcdefgh', я так понимаю, именно это и должно было получиться?}
ReadLn;
end.

Почему не StrCat, а StrLCat? Очень просто: StrCat не осуществляет контроль границ, то есть, если под первый параметр выделено меньше места, чем надо для хранения результата - то последствия будут неприятными. StrLCat же увеличивает размер буфера так, чтобы результат в него поместился (собственно, для этого там и предусмотрен третий параметр)...

Читайте документацию, внимательно читайте, это помогает разобраться...
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Ldnb   Как скопировать строку PChar ?   11.05.2010 4:56
TarasBer   Перед StrCopy надо заранее выделить память (длина ...   11.05.2010 10:12
Ldnb   К сожалению, надо на Турбо Паскале... ;( Можно м...   11.05.2010 10:32
TarasBer   > К сожалению, надо на Турбо Паскале... ;( Зад...   11.05.2010 10:43
volvo   Правильно копировать строку, предварительно прочит...   11.05.2010 13:04
TarasBer   :dry: "Плохому танцору... " (С) Народн...   12.05.2010 10:03
Ldnb   Спасибо! А правильно добавить строку p2 к стр...   11.05.2010 18:17
volvo   А как потом освобождать память в таком случае?   11.05.2010 23:09
Ldnb   А как правильно? :( Подскажите, пожалуйста. В общ...   12.05.2010 0:16
volvo   Хм... Вот так: uses strings; var s: array[0 .. ...   12.05.2010 1:18
Ldnb   Так...значит, всё-таки операция strcat(pp, strnew(...   12.05.2010 1:37
volvo   Так не пойдет, будет утечка памяти. uses strings;...   12.05.2010 11:58
TarasBer   Так не пойдет, будет утечка памяти. Что я делаю...   12.05.2010 12:56
Ldnb   :blink: :blink: :blink: :blink: :blink: :blin...   13.05.2010 19:41
volvo   Ты читать умеешь? Все, дальше можешь ничего не дел...   13.05.2010 21:12
Ldnb   За поправление спасибо, учтём, но меня интересует ...   14.05.2010 0:11
Ldnb   Эх... видимо нормально работать с PChar всё-таки н...   15.05.2010 8:06


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 23.06.2025 13:31
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"