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

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

Функция копирования PChar в string [D6, D7, Win2k, WinXP]


Страницы:   1 2

MetalFan ©   (2006-10-16 17:57:00) 

что необходимо:
1) копировать содержимое string в Pchar
2) выделять/перевыделять память под PChar
3) очищать PChar, если длинна string = 0;

вот написана такая функция
function SetPChar( var APChar: PChar; const ACopyString: string): PChar;
 var
   lLenStr: Integer;
 begin
   Result := nil;
   lLenStr := Length(ACopyString);
   if (APChar = nil) and ( lLenStr= 0) then Exit;
   if lLenStr = 0 then
   begin
      FreeMem( APChar{, 0});
      APChar := nil;
   end
   else
   begin
     ReallocMem( APChar, lLenStr + 1);
     //Result := StrLCopy(APChar, PChar(ACopyString), lLenStr);
     CopyMemory( APChar, @ACopyString[1], lLenStr);
     APChar[lLenStr] := #0;
   end;
   Result := APChar;
 end;

оцените ее правильность %) что-то никак не соображу, есть ли тут косяки...


Ketmar   (2006-10-16 19:09:00) [21]

на:
function SetPChar (var aPChar: PChar; const aCopyString: string): PChar;
var
 lLenStr: Integer;
begin
 lLenStr := Length(aCopyString);
 ReallocMem(aPChar, lLenStr);
 if lLenStr > 0 then Move(aCopyString[1], aPChar^, lLenStr+1);
 result := aPChar;
end;


MetalFan   (2006-10-16 19:04:00) [22]

нет, функция должна однозначно копировать содержимое входной string  в pchar, чтобы дальнейшая судьба string'а никак не влияла на резульирующий pchar.

ладно, вопрос тот же: нет ли ошибок в функции в [0]?.
просто интересно мнение...


Leonid Troyanovsky   (2006-10-16 18:43:00) [23]


> MetalFan ©   (16.10.06 18:08) [2]

> если p - внешнияя переменная, а s внутренняя, то после оконачния
> процедуры, где объявлена s, p будет указывать в... на...
>  короче не туда)


Конечно, в никуда.
Самое простое - поменять ролями s & p, т.е., пусть p - внутренняя.
Ну, а освобождать строку просто: s := ''

--
Regards, LVT.


Ketmar   (2006-10-16 18:40:00) [24]

>[4] MetalFan(c) 16-Oct-2006, 18:33
>мм... и что, весь функционал в [0] оказывается ненужным?! )
угу. "наука умеет много гитик" (ц) %-)


MetalFan   (2006-10-16 18:33:00) [25]

мм... и что, весь функционал в [0] оказывается ненужным?! )


Eraser   (2006-10-16 18:08:00) [26]

> [1] Desdechado ©   (16.10.06 18:03)


> s:=String(p);

s := p;
UniqueString(s);


> p:=PChar(s);


p := PChar(s);


MetalFan   (2006-10-16 18:08:00) [27]

а происходит ли при это копирование содержания s и з.
если p - внешнияя переменная, а s внутренняя, то после оконачния процедуры, где объявлена s, p будет указывать в... на... короче не туда)
или нет?


Desdechado   (2006-10-16 18:03:00) [28]

var p:Pchar;
s:String;

s:=String(p);
p:=PChar(s);


Страницы:   1 2

Наверх

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