Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.034 c
3-1092762020
Loaderz
2004-08-17 21:00
2004.09.12
Длина строк в БД.


14-1093516749
Micah'GF
2004-08-26 14:39
2004.09.12
Ищу аналог Visio


1-1093453210
lipskiy
2004-08-25 21:00
2004.09.12
Индикатор занятости программы? Подскажите как лучше организовать?


14-1093149042
ААМ
2004-08-22 08:30
2004.09.12
А ?


3-1092680067
_Dragon
2004-08-16 22:14
2004.09.12
Обновление записей





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