Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Insert/Delete mit PChar (https://www.delphipraxis.net/26844-insert-delete-mit-pchar.html)

Shaman 30. Jul 2004 09:26


Insert/Delete mit PChar
 
Hallo zusammen

Ich habe folgende zwei Funktionen:

Delphi-Quellcode:
function InsertBuffer(var Dest: PChar; const DestSize: Integer;
                      const Buffer: PChar; const BufferSize: Integer; const Index: Integer): Integer;
var
  S: string;
begin
  SetString(S, Dest, DestSize);
  FreeMem(Dest, DestSize);
  Insert(Buffer, S, Index+1);
  Result:= Length(S);
  GetMem(Dest, Result);
  Move(S[1], Dest^, Result);
end;

function DeleteBuffer(var Dest: PChar; const DestSize: Integer; const Index, Count: Integer): Integer;
var
  S: string;
begin
  SetString(S, Dest, DestSize);
  FreeMem(Dest, DestSize);
  Delete(S, Index+1, Count);
  Result:= Length(S);
  GetMem(Dest, Result);
  Move(S[1], Dest^, Result);
end;
Wie lassen sich diese optimieren? Vorallem die Umwege über Insert und Delete gefallen mir nicht... :?

Gruss
Shaman

Shaman 31. Jul 2004 15:39

Re: Insert/Delete mit PChar
 
Das kann man doch besser machen? So ist es verdammt langsam :(

Shaman 1. Aug 2004 21:13

Re: Insert/Delete mit PChar
 
Ich habs schliesslich selbst rausgefunden :wink:. So gehts ein bisschen schneller:

Delphi-Quellcode:
procedure InsertBuffer(var Dest: PChar; const DestSize: Integer;
                       const Buffer: PChar; const BufferSize: Integer; const Index: Integer);
var
  Dest2: PChar;
begin
  GetMem(Dest2, BufferSize + DestSize);
  Move(Dest^, Dest2^, Index);
  Move(Buffer^, (Dest2 + Index)^, BufferSize);
  Move((Dest + Index)^, (Dest2 + Index + BufferSize)^, DestSize - Index);
  FreeMem(Dest, DestSize);
  Dest:= Dest2;
end;

function DeleteBuffer(var Dest: PChar; const DestSize: Integer; const Index, Count: Integer): Integer;
var
  Dest2: PChar;
begin
  GetMem(Dest2, DestSize - Count);
  Move(Dest^, Dest2^, Index);
  Move((Dest + Index + Count)^, (Dest2 + Index)^, DestSize - Index - Count);
  FreeMem(Dest, DestSize);
  Dest:= Dest2;
end;
Gruss
Shaman


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz