Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
ВнизВставка строки в PChar Найти похожие ветки
← →
HydraMarat (2004-08-26 15:00) [0]Знаю, вопрос может показаться тупым, но я ничего не нашел через "Поиск"...
Как вставить в PChar? Причем указатель естественно нельзя изменять
P1 = "I Mercedes";
P2 = "love";
надо получить "I love Mercedes".
Че то не доходит до меня. Есть ли встроенная функция? Или всякими там Realloc"ами мудиться?...
Спасибо.
← →
HydraMarat (2004-08-26 15:02) [1]Еще интересно: если я ранее проинициализированному через StrNew полю присвою какое-то выражение типа PChar, то измениться ли значение указателя? Или же компилятор сделает так, что изменяться только данные?
← →
clickmaker © (2004-08-26 15:05) [2]Insert()
> Причем указатель естественно нельзя изменять
тогда надо заранее резервировать место для возможных вставок
← →
HydraMarat (2004-08-26 15:06) [3]Так Insert вроде только со string"ами. А мне бы хотелось чисто на PChar"ном уровне.
← →
Семен Сорокин © (2004-08-26 15:07) [4]работай со string"ами, а результат переводи в PChar если нужно.
← →
HydraMarat (2004-08-26 15:14) [5]А неизмениться ли тогда значение указателя в поле? Не потеряю ли я данные, ранее завязанные за ним?
Суть в том, что объект А создает строку через StrNew, он же ее и разрушает через StrDispose. А вот работает с ней другой объект, который занимается и вставкой в том числе. Я пробовал через StrMove, но тогда на StrDispose возникает EAccessViolation.
← →
Уток (2004-08-26 15:20) [6]Семен- самое разумное предложил:
если Result :PAnsiChar; и st1,st2:string;
Result:=pointer(st1+st2+#0);
← →
HydraMarat (2004-08-26 15:25) [7]Хочешь сказать, что данные, записанные ранее через StrNew, сами освободятся из памяти?
← →
Amoeba © (2004-08-26 15:42) [8]Если нужно чтобы указатель не менялся, то единственный способ - это как предлагает
> clickmaker © (26.08.04 15:05) [2]
← →
HydraMarat (2004-08-27 10:37) [9]Я вот тут подумал, если StrNew выглядет следующим образом:
function StrNew(const Str: PChar): PChar;
var
Size: Cardinal;
begin
if Str = nil then Result := nil else
begin
Size := StrLen(Str) + 1;
Result := StrMove(StrAlloc(Size), Str, Size);
end;
end;
то может можно написать следующее:
procedure StrRealloc(var Str: PChar; Size: Cardinal);
begin
if Str <> nil then
begin
Dec(Str, SizeOf(Cardinal));
ReallocMem(Str, Size);
Cardinal(Pointer(Str)^) := Size;
Inc(Str, SizeOf(Cardinal));
end;
end;
Однако, почему-то не работает. Для одной переменной все OK, а когда повторно вызываю, то снова возникает исключение. Почему же? Объясните, пожалуйста.
← →
HydraMarat (2004-08-27 10:42) [10]Тьфу! Надо же было не StrNew, а StrAlloc:
function StrAlloc(Size: Cardinal): PChar;
begin
Inc(Size, SizeOf(Cardinal));
GetMem(Result, Size);
Cardinal(Pointer(Result)^) := Size;
Inc(Result, SizeOf(Cardinal));
end;
← →
HydraMarat (2004-08-27 19:07) [11]Я, конечно, извиняюсь, что поднимаю вопрос, но может кто-нибудь что-нибудь еще скажет... ОООчень надо!
Или забить? Может все-таки со string"ами работать? Реально ли они тормознее PChar?
← →
Yuri-7 (2004-08-27 23:24) [12]p1:="I Mersedes";
p2:="love";
p1:=Pchar(Copy(String(p1),1,2)+ String(p2)+" "+Copy(String(p1),3,8));
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c