Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi StripString Namen gesucht (https://www.delphipraxis.net/146349-stripstring-namen-gesucht.html)

WoGe 18. Jan 2010 15:14


StripString Namen gesucht
 
Hallo
nachdem ich für D2010 eine Function wie strman.GetChars gesucht und NIX gefunden habe, hab ich mir selber eine gemacht:
Delphi-Quellcode:
function StripString(const sTemp: String;const ValidChars: TSysCharSet): String;
 var c : char;
begin
  Result := '';
  for c in sTemp do if charinset(c,ValidChars) then Result := Result + c;
end;
Habe ich damit die 'neuen' Features richtig ausgereizt (Hatte bisher nur D7)
und wie sollte man eine solche Funktion nennen?
Gefunden habe ich folgende Namen: Getchars, StripNonConforming, OnlyInt

Grüsse
wo

himitsu 18. Jan 2010 16:13

Re: StripString Namen gesucht
 
Zumindestens könnte man das Speichermanagement verbessern
und das ginge auch schon in den Vorgänger-Delphi-Versionen.
Delphi-Quellcode:
function StripString(const sTemp: String; const ValidChars: TSysCharSet): String;
var c : Char;
  i : Integer;
begin
  i := 0;
  for c in sTemp do
    if CharInSet(c, ValidChars) then Inc(i);
  SetLength(Result, i);
  i := 0;
  for c in sTemp do
    if CharInSet(c, ValidChars) then
    begin
      Inc(i);
      Result[i] := c;
    end;
end;
Auch wenn es mehr aussieht, ist es so im Endefekt sogar eine Berechnung weniger, je Durchlauf.
Delphi-Quellcode:
if CharInSet(c, ValidChars) then
begin
  Result[i + 1] := c;
  Inc(i);
end;

Jaynder 18. Jan 2010 16:20

Re: StripString Namen gesucht
 
und am schluss bitte noch ein
Delphi-Quellcode:
  SetLength(Result, i);

himitsu 18. Jan 2010 16:33

Re: StripString Namen gesucht
 
Wieso?

[edit]
oder "Warum?", bzw. "Weshalb?"

WoGe 18. Jan 2010 16:34

Re: StripString Namen gesucht
 
Zitat:

Zitat von himitsu
Zumindestens könnte man das Speichermanagement verbessern...

Ist das wirklich so schlimm
Delphi-Quellcode:
Result := Result + c
Das es den zusätzlichen Auwand rechtfertigt?

Gruss wo

himitsu 18. Jan 2010 16:41

Re: StripString Namen gesucht
 
Probier es einfach aus.
Delphi-Quellcode:
Var C: LongWord;
  S: String;
  i: Integer;
Begin
  S := '';
  C := GetTickCount;
  For i := 1 to 50000000 do S := S + 'a';
  Memo1.Lines.Add(IntToStr(GetTickCount - C));

  S := '';
  C := GetTickCount;
  SetLength(S, 50000000);
  For i := 1 to 50000000 do S[i] := 'a';
  Memo1.Lines.Add(IntToStr(GetTickCount - C));
End;
PS: die Zeit steigt übrigens Exponential an, wärens es ansonsten (nur einmal Speicher reservieren) Linear wäre.

S:=S+'a'; bedeutet soviel, wie neuen String anlegen, beide Teile reinkopieren, alten String freigben und den neuen String an die Variable übergeben.

Jaynder 18. Jan 2010 16:44

Re: StripString Namen gesucht
 
Zitat:

Zitat von himitsu
Wieso?

[edit]
oder "Warum?", bzw. "Weshalb?"

Sonst stimmt die Länge deines Result nicht, wenn du wirklich Zeichen 'strip'st und hintendran steht eine entspechende Anzahl #0

himitsu 18. Jan 2010 16:47

Re: StripString Namen gesucht
 
Zitat:

Zitat von Jaynder
Sonst stimmt die Länge deines Result nicht, wenn du wirklich Zeichen 'strip'st und hintendran steht eine entspechende Anzahl #0

Ich kann mich täuchen, aber ich glaub es stimmt schon.

WoGe 18. Jan 2010 17:02

Re: StripString Namen gesucht
 
Hallo

ist diese Variante jetzt besser?
Delphi-Quellcode:
function StripString(const sTemp: String;const ValidChars: TSysCharSet): String;
var c : Char;
  i : Integer;
begin
  i := 0;
  Setlength(result,sizeof(sTemp));
   for c in sTemp do
    if CharInSet(c, ValidChars) then
    begin
      Inc(i);
      Result[i] := c;
    end;
  Setlength(result,i);
end;
Da reservier ich am Anfang zwar möglicherweise ein paar :) Bytes zuviel, spare mir aber die 1te Schleife

Gruss wo

Edit: Formverweise entfernt

himitsu 18. Jan 2010 17:20

Re: StripString Namen gesucht
 
Wenn du statt SizeOf(sTemp) ein Length(sTemp) nimmst, dann geht das auch.

Jaynder 18. Jan 2010 17:24

Re: StripString Namen gesucht
 
Wer hat eigentlich die 1-basierenden Strings verbockt?:wall:

himitsu 18. Jan 2010 17:30

Re: StripString Namen gesucht
 
Zitat:

Zitat von Jaynder
Wer hat eigentlich die 1-basierenden Strings verbockt?:wall:

Das liegt am ShortString, welcher in Delphi 1, bzw eigentlich schon in Pascal eingeführt wurde.

Feld 0 ist dort das Längenbyte und demnach fängt bei 1 der String an.
Dieses wurde dann später auf die "neuen" AnsiStrings übernommen,
nur daß es dort das Längen-Byte so nicht mehr gibt.

Umstellen läßt es sich jetzt nun auch nicht mehr ... sehr viele Programme würden dann ja nicht mehr laufen.

Jaynder 18. Jan 2010 17:35

Re: StripString Namen gesucht
 
Zitat:

Zitat von himitsu
Umstellen läßt es sich jetzt nun auch nicht mehr ... sehr viele Programme würden dann ja nicht mehr laufen.

Weiß ich ja, ist mir nur wiedereinmal so hochgekommen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:49 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