Delphi-PRAXiS
Seite 5 von 16   « Erste     345 6715     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Anzahl eines Zeichens im String ermitteln (https://www.delphipraxis.net/116372-anzahl-eines-zeichens-im-string-ermitteln.html)

KodeZwerg 12. Jul 2018 16:40

AW: Anzahl eines Zeichens im String ermitteln
 
Zitat:

Zitat von gammatester (Beitrag 1407043)
Der Code (und auch einige andere) bricht aber die Schleife ab, wenn S ein #0 enthält, zB S = '123'#0#1#2'123'. (Habe nicht den ganzen Thread gelesen, und weiß also nicht ob das verboten ist).

Guter Einwand, Danke dafür,
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.

Harry Stahl 12. Jul 2018 17:07

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:
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 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).

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...

jaenicke 12. Jul 2018 18:16

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.

KodeZwerg 12. Jul 2018 19:38

AW: Anzahl eines Zeichens im String ermitteln
 
Zitat:

Zitat von jaenicke (Beitrag 1407066)
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.

Ich habe mal Deinen Vorschlag versucht umzusetzen.
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;

Uwe Raabe 12. Jul 2018 21:31

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;

p80286 12. Jul 2018 23:11

AW: Anzahl eines Zeichens im String ermitteln
 
Müßte es nicht heißen
Delphi-Quellcode:
 inc(p^,sizeof(char));
?

Gruß
K-H

Uwe Raabe 12. Jul 2018 23:41

AW: Anzahl eines Zeichens im String ermitteln
 
Zitat:

Zitat von p80286 (Beitrag 1407099)
Müßte es nicht heißen
Delphi-Quellcode:
 inc(p^,sizeof(char));
?

Ich vermute mal, die Dereferenzierung ist ein Versehen, denn das würde den Character-Wert ändern und nicht den Pointer.

Das
Delphi-Quellcode:
Sizeof(Char)
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.

http://docwiki.embarcadero.com/Libra.../de/System.Inc
Zitat:

Wenn X ein Zeigertyp ist, wird X um N-mal der Größe des Typs, auf den gezeigt wird, inkrementiert. Für

type PMyType = ^TMyType;

und

var P: PMyType;

inkrementiert die Anweisung Inc(P) P um SizeOf(TMyType).

KodeZwerg 13. Jul 2018 00:39

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.

Neutral General 13. Jul 2018 08:31

AW: Anzahl eines Zeichens im String ermitteln
 
Zitat:

Zitat von jaenicke (Beitrag 1407066)
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.

Ich hatte gestern da versucht was zu bauen und hatte am Ende wirklich einen sehr kurzen und schnell aussehenden Code mit scasw usw. Aber im Benchmark von KodeZwerg wars trotzdem nur auf dem 2. Platz, weswegen ich nichts gepostet hatte.

freimatz 13. Jul 2018 08:53

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.
Seite 5 von 16   « Erste     345 6715     Letzte »    

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