![]() |
Doppelte Zeichen löschen
Moin,
Nehmen wir mal an ich habe folgenden String: Zitat:
Also das es nachher so aussieht: Zitat:
Delphi-Quellcode:
Das funktioniert auch, aber ich möchte es optimieren. Das "Result := Result + S[I];" dürfte wohl den langsamsten Teil ausmachen... Wie könnte ich das ganzen nun mit PChars hinkriegen?
function FmtTok(const S: string; const C: Char): string;
var B: Boolean; I: Integer; ResLen: Integer; begin Result := ''; if S <> '' then begin B := True; for I := 1 to Length(S) do begin if (S[I] <> C) or ((S[I] = C) and (not B)) then Result := Result + S[I]; B := S[I] = C; end; ResLen := Length(Result); if Result[ResLen] = C then SetLength(Result, ResLen-1); end; end; Ich habs so versucht (*g*):
Delphi-Quellcode:
Nicht schimpfen! Das ist erst mein erster Versuch mit PChars zu arbeiten! *g*
function FmtTok(const S: string; const C: Char): string;
var SPtr, ResPtr: PChar; SI: Integer; B: Boolean; begin SetLength(Result, Length(S)); if S <> '' then begin SPtr := @S[1]; ResPtr := @Result[1]; SI := 1; B := True; while SPtr <> #0 do begin if (SPtr^ <> C) or ((SPtr^ = C) and (not B)) then begin ResPtr := SPtr; Inc(ResPtr); end; B := SPtr^ = C; Inc(SI); Inc(SPtr); end; if ResPtr^ = C then SetLength(Result, Length(Result)-1) else SetLength(Result, Length(Result)); end; end; Naja der Code(letzterer) funktioniert nicht, gibt ewig Exceptions... jemand ne Idee was verkehrt ist? =[ |
Re: Doppelte Zeichen löschen
Hallo Pseudemys Nelsoni,
fuer Strings kannst du ja ![]() ![]()
Delphi-Quellcode:
kA ob die Parameterreihenfolge stimmt ;)
SomeVar := StringReplace('..', '.', SomeVar, [rfReplaceAll]);
Greetz alcaeus |
Re: Doppelte Zeichen löschen
hallo alcaeus,
erstmal danke für deine Antwort ;) Aber wie gesagt:
Delphi-Quellcode:
Mit StringReplace wäre die Funktion gleich 10 mal langsamer als meine Ausgangsfunktion. Ich möchte es ja optimieren und nicht verkleinern ;)
_schnellst_möglich
Wie gesagt meine obige Funktion geht, die untere nicht. |
Re: Doppelte Zeichen löschen
Ich würde es wohl eher so machen:
Delphi-Quellcode:
Ungetestet ;)
function FmtTok(const S: string; const C: Char): string;
var ResP, SP, OrgRes: PChar; begin SetLength(Result, Length(S)); if S <> '' then begin SP := @S[1]; ResP := @Result[1]; OrgRes := ResP; while SP^ <> #0 do begin if (ResP^ <> C) or (SP^ <> C) or ((ResP^ <> C) and (SP^ = C)) then begin if ResP^ = C then Inc(ResP); ResP^ := SP^; end; if (SP^ <> C) then Inc(ResP); Inc(SP); end; SetLength(Result, StrLen(OrgRes)); end; end; Edit: Jetzt gehts hoffentlich.. ja, es geht |
Re: Doppelte Zeichen löschen
Hallo Dax,
das löscht aber alle Punkte. Ich weiss ja nicht ob du mein Editiertes nich gelesen hast ;) Aber aus: Zitat:
Zitat:
werden. Hast du da ne Idee? |
Re: Doppelte Zeichen löschen
:oops: Sorry.. war wohl ein wenig übereifrig, Moment. Steht gleich oben - hoffentlich korrekt ;-)
|
Re: Doppelte Zeichen löschen
Liste der Anhänge anzeigen (Anzahl: 2)
Man muss nicht unbedingt mit PChar arbeiten um schnell zu sein.
Grüße vom marabu Nachtrag: Eine Routine zum Komprimieren eines speziellen Zeichens. |
Re: Doppelte Zeichen löschen
Moin moin Dax,
danke für deine Mühe :) Hast du noch ne Idee wie ich die beiden Punkte aussen wegbekomme? Zitat:
ich wüsste nicht wie ich das mit einbringen könnte, aber ich denke ich würds verstehen wenn ichs sehe |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:09 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-2025 by Thomas Breitkreuz