![]() |
Stringfunktionen verprassen Speicher
Hallo,
ich habe von FastMM gesehen, das eine Funktion Speicher verbrät, in dieser Funktion wird ein String in 2 Teile getrennt. Da geht jedes mal quasi die Länge des übergebenen Strings verloren. Wenn man das 5000 mal macht, sind auch 50 Bytes eine Menge. Die Funktion spaltet einen übergebenen String auf in 2 Teile, vor dem Trenner und nach dem übergebenen Trennzeichen Bsp: strPara := 'Welt=Delphi'; strResult := TrenneParaAb('=',strPara); dann wird strResult = 'Welt'; strPara = 'Delphi';
Delphi-Quellcode:
Gibt es bessere Stringfunktionen als die von Delphi?
function TrenneParaAb(const Zeichen: String; var Para:String):String;
var i : integer; begin result:=''; If Pos(Zeichen,Para) > 0 then begin If length(Zeichen)=1 then begin { 1 Zeichen } i:=Pos(Zeichen,Para); If i>0 then begin result:= copy(Para,1,Pred(i)); delete(Para,1,i); <-------------- Die Zeile gibt FastMM an end; end else begin { Hier mehrere Zeichen übergeben } i:=Pos(Zeichen,Para); If i>0 then begin result:=copy(Para,1,Pred(i)); delete(Para,1,(i+Pred(length(Zeichen)))); end; end; end; { If Pos } end; Hier noch das Listing von FastMM Aufrufstack, von wem der Block momentan belegt wird (Rücksprungadressen): 403132 [sys\system.pas][System][System.@GetMem][2654] 405575 [sys\system.pas][System][System.@NewAnsiString][12429] 40595B [sys\system.pas][System][System.InternalUniqueString][13256] 4059E6 [sys\system.pas][System][System.@LStrDelete][13380] 4870D3 [..\common\FileUtils.pas][FileUtils][FileUtils.TrenneParaAb][415] Für Tips wäre ich dankbar, Gruß Tom |
Re: Stringfunktionen verprassen Speicher
Warum so kompliziert?
|
Re: Stringfunktionen verprassen Speicher
Wie einfacher?
|
Re: Stringfunktionen verprassen Speicher
|
Re: Stringfunktionen verprassen Speicher
morgn,
vereinfachen kannst du deinen code auf jeden fall schon mal so (würd ich jetzt mal sagen, keine garantie ;-)):
Delphi-Quellcode:
was du mit speicherverprassen meinst, hab ich noch nicht ganz verstanden.
function TrenneParaAb(const Zeichen: String; var Para:String):String;
var i : integer; begin result:=''; If Pos(Zeichen,Para) > 0 then begin i:=Pos(Zeichen,Para); result:=copy(Para,1,Pred(i)); delete(Para,1,(i+Pred(length(Zeichen)))); end; end; |
Re: Stringfunktionen verprassen Speicher
Delphi-Quellcode:
function TrenneParaAb(const Zeichen: String; var Para:String):String;
var sl: TStrings; begin result:=''; sl := TStringList.Create; sl.StrictDelimiter := True; sl.Delimiter := Zeichen; sl.DelimitedText := Para; Result := sl[1]; Para := Sl[0]; sl.Free; end; |
Re: Stringfunktionen verprassen Speicher
Und da noch ein try-finally einfügen ;)
|
Re: Stringfunktionen verprassen Speicher
Interessant das mit der Stringliste,
geht hier leider nicht, weil im hinteren Teil des Strings nochmal das Trennzeichen kommen kann, der hintere Teil aber als ganzes zurückgegeben werden muss. Danke + Gruß Tom |
Re: Stringfunktionen verprassen Speicher
Hallo,
für das Zerlegen eines Strings an einem Literal findest du hier noch die Funktionen Split() und ParseStr(): ![]() Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz