AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi schnelleres StringReplace und MultiStringReplace
Thema durchsuchen
Ansicht
Themen-Optionen

schnelleres StringReplace und MultiStringReplace

Ein Thema von himitsu · begonnen am 20. Nov 2009 · letzter Beitrag vom 17. Mär 2016
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#1

AW: schnelleres StringReplace und MultiStringReplace

  Alt 10. Jun 2010, 12:12
Hmmm, hast du mal einen TestString parat?
Mir ist grade aufgefallen, daß in meinem Testcode das Pattern auch schon am Ende des Strings liegt.

und ebenso hier tritt kein Fehler auf.
Delphi-Quellcode:
S := '123Wort';
S2 := StringReplace(S, 'Wort', 'xxx', [rfReplaceAll]);
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
239 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: schnelleres StringReplace und MultiStringReplace

  Alt 10. Jun 2010, 12:39
Steht doch oben als Delphi Code!

Ich benutze Delphi 2010 und du?
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
239 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: schnelleres StringReplace und MultiStringReplace

  Alt 10. Jun 2010, 12:45
Dein Beispiel knallt bei mir auch!

exception number : 1
exception class : ERangeError
exception message : Range check error.

main thread ($17c4):
005376bc +03dc STGCommonUnitTest.exe StrRep 132 +37 StringReplace
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#4

AW: schnelleres StringReplace und MultiStringReplace

  Alt 10. Jun 2010, 12:51
Das hatte ich vorhin auch zum Testen verwendet.

Welche Version nutzt du denn?
Die _300 aus Beitrag #1 sollte die aktuellere Version 1.1 vom 20.11.2009 22°° sein.
(is'n bissl blöd, das mit den nun fehlenden Attachment-Kommentaren und den veränderten Dateinamen)



Ich teste gleich nochmal 'n bissl rum.
(bin grade auf die Idee gekommen mal wieder die Bereichsprüfung zu aktiveren )
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
239 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: schnelleres StringReplace und MultiStringReplace

  Alt 10. Jun 2010, 12:53
Ich benutze "natürlich" die v1.1.

Wenn ich die Move-Zeile mit einer If-Abfrage auf i4<>0 ändere, geht alles gut:

if i4<>0 then Move(S[i], Result[i2], i4 * SizeOf(Char));
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#6

AW: schnelleres StringReplace und MultiStringReplace

  Alt 10. Jun 2010, 13:01
Jupp, genau sowas hatte ich grade verbaut.

Hach ja, der Fehler ist in meinem aktiven Code nie aufgefallen,
aber dazu sei vielleicht erwähnt, daß der Originalcode eine andere Stringverwaltung via PChar besitzt.

ähhhh ... ich würde es ja gerne Anhängen, aber das geht nicht.

Also bitte vor alle "Move" das "if i4 <> 0 then " einfügen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
239 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: schnelleres StringReplace und MultiStringReplace

  Alt 10. Jun 2010, 13:10
Bin gerade mal Step-by-Step da durchgegangen mit deinem Beispiel mit 123Wort:

i=8
Length(S)=7
i2=7
i4=0

Der Knall kommt dann vom S[i]=S[8] bei einem String mit 7 Zeichen.
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#8

AW: schnelleres StringReplace und MultiStringReplace

  Alt 10. Jun 2010, 13:19
Jupp, wenn dieses der letzte Fund ist, dann wird versuchst den restlichen nachfolgenden String in das Result zu kopieren.
Der selbe Fehler sollte also auch auftreten, wenn der Pattern mehrfacht direkt hintereinander liegt.

Ohne Bereichsprüfung passiert da eigentlich auch nichts, da Move mit einer Länge von 0 aufgerufen würde,
aber mit Bereichsprüfung bekommt diese natürlich mit, daß der Zeichenindex nach dem Fund natürlich außerhalb des Strings liegt.
Daß letztendlich aber dann doch kein Zugriff auf diesen Index passiert, Aufgrund der Länge=0, bekommt dieser Prüfcode natürlich nicht mit.

Im Originalcode hatte ich die Prüfung von MoveMemory ausgenutzt und daher keine Eigene verbaut,
was allerdings bei dem direkten Zugriff auf den String (via S[i]) nicht mehr so gut enden muß.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (10. Jun 2010 um 13:24 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:58 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