![]() |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
dann betone ich hiermit was für was geeignet ist (abgesehen vom StringReplace, das fliegt generell raus) Für Strings die Text enthalten wie "Ich bin ein String der Text enthält." kann man alle methoden nehmen. Für Strings die binär sind: CountCharInString(), CharInStringA() und CharCount() nicht verwenden. |
AW: Anzahl eines Zeichens im String ermitteln
Ich werfe noch eine Version in die Runde, die auch auf den mobilen Plattformen funktioniert (Stringzählung beginnt bei Null):
Delphi-Quellcode:
Auch ein #0 dazwischen stört nicht. Alternativ kann man noch mit Low (s) to High (s) arbeiten (so bei mir i.d.R. für Cross Plattform Projekte in der Anwendung).
function StringCountChar(const S: string; const C: Char): Integer;
var ch: Char; begin Result := 0; for ch in S do begin if ch = C then Inc(Result); end; end; Auch wenn Du derzeit mit D2009 ide mobilen Plattformen noch nicht bedienen kannst, könnte es ja nicht schaden, seine Funktionen auf denkbare Eventualitäten zu rüsten. Solche Sachen später zu finden und zu beheben ist nämlich nicht ganz ohne Mühe... EDit: Sehe gerade in Beitrag #14 kam das schon mal... Na ja, dann eben zur Erinnerung... |
AW: Anzahl eines Zeichens im String ermitteln
Wenn es wirklich auf die Performance ankommt, blieben noch spezielle CPU Instruktionen wie repne scasb bzw. repne scasw. Die habe ich auch schon benutzt, aber das macht nur Sinn, wenn es wirklich Not tut. Eben wegen Portabilität usw.
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Ich würde mich über eine besser funktionierende Version als diese hier freuen, mein assembler ist doch stark eingerostet. Vielleicht ist Code auch korrekt nur Ausführung ist recht langsam weil ich ein PChar rauswerfe wo man mit Length() die Treffer abfragt.
Delphi-Quellcode:
function StrScanAsm(Str: String; Chr: Char): PChar; assembler;
asm OR EAX,EAX JZ @@2 PUSH EDI MOV ECX,[EAX-4] MOV EDI,EAX MOV EAX,EDX REPNE SCASB MOV EAX,0 JNE @@1 MOV EAX,EDI DEC EAX @@1: POP EDI @@2: end; |
AW: Anzahl eines Zeichens im String ermitteln
Nur so zum Spaß noch eine Version, die auch mit PChar arbeitet, aber trotzdem #0 Zeichen im String zulässt.
(Kann sein, daß die Pointer-Arithmetik in älteren Versionen noch nicht funktioniert. Dann die auskommentierte Variante verwenden.)
Delphi-Quellcode:
function CharCount(const S: string; C: Char): Cardinal;
var P, PEnd: PChar; begin Result := 0; P := PChar(S); PEnd := P + Length(S)); // PEnd := P; // Inc(PEnd, Length(S)); while P < PEnd do begin while P^ <> C do begin Inc(P); if P = PEnd then Exit; end; Inc(Result); Inc(P); end; end; |
AW: Anzahl eines Zeichens im String ermitteln
Müßte es nicht heißen
Delphi-Quellcode:
?
inc(p^,sizeof(char));
Gruß K-H |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Das
Delphi-Quellcode:
ist hier nicht nur nicht notwendig, sonder wäre sogar schädlich. Bei typisierten Pointern (hier PChar) wird bei Inc/Dec die Größe des Typs (in diesem Fall Char) berücksichtigt. Funktioniert auch hervorragend mit Pointern auf Records. Lediglich bei (untypisiertem) Pointer wird byte-weise verändert.
Sizeof(Char)
![]() Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Danke Uwe, funktioniert Pfeilschnell auch im binär Modus. Das ist mein momentaner Favorit, das alte StrScan() verschwindet somit.
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Wegen Portabilität und so: Ihr berücksichtigt keine Unicode Surrogate-Paare.
Und zu den Assembler Varianten: geht das auch auf 64-Bit? Und wem die primitiv-Variane zu langsam ist sollte erst mal prüfen warum man die Suche überhaupt braucht. Die zu vermeiden ist meist der wesentlich schnellere Weg. In der Regel ist der aufrufende Code sch...licht verbesserungswürdig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18: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