![]() |
AW: Leerzeichen in String einfügen
@Sir Rufo sehr nice und wie immer natürlich variable und "zu gebrauchen" :thumb:
@EgonHugeist der Quadmove ist natürlich sehr nett, aber da durch brauchst Du drumrum natürlich mehr... Wäre zu testen ob der Quadmove das wett macht... Alle Routinen mit Insert - gehen natürlich gar nicht - weil der String nicht nur 192 Zeichen, sondern auch mal 20MB lang seinen kann... :stupid: Die Frage ist, wenn der String Steuerzeichen hat - wie #13#10 oder #10#13 oder nur #10 oder #13... Beginnt der Zähler dann bei 0? Und natürlich darf das " " oder "_" nicht zwischen #13_#10 eingefügt werden... Kommt Leute da geht noch was... |
AW: Leerzeichen in String einfügen
@mav
meine Portierung hält sich exakt an das, was der TE wollte. Ich halte es für abwägig, das LineEndings oder andere ctrl chars im TEdit landen... Klar geht noch was:
Code:
und nu 2 quad moves in einer loop (macht nur sinn, wenn der String länger ist)
function EH_QuadUnderScoreFillerBy4(Const Text: String): String;
type PMyQuadMover = {$IFDEF UNICODE}PUInt64{$ELSE}PLongWord{$ENDIF}; var Src, Dest, PEnd: PChar; SrcLen: Integer; begin if Text = '' then Result :='' else begin SrcLen := PLongInt(NativeUInt(Text) - SizeOf(LongInt))^; //fast get src length Src := Pointer(Text); PEnd := Src+SrcLen-5; if (Pointer(Result) = nil) or //result unassigned? (PLongInt(NativeUInt(Result) - SizeOf(LongInt))^ <> SrcLen) {PStrRec.Len} or //length different? (PLongInt(NativeUInt(Result) - (SizeOf(LongInt) shl 1))^ <> 1) {PStrRec.RefCnt} then //no unique string? SetLength(Result,SrcLen+((SrcLen-1) shr 2)); Dest := Pointer(Result); while (Src <= PEnd) do begin//making a quad processing loop PMyQuadMover(Dest)^ := PMyQuadMover(Src)^; (Dest+4)^ := '_'; Inc(Dest, 5); Inc(Src, 4); end; Inc(PEnd, 4); while Src < PEnd do //processing final chars begin Dest^ := Src^; Inc(Src); Inc(Dest); end; Dest^ := Src^; //null term save end; end;
Code:
Jup mehr drum herum, ist nicht abzustreiten. Jags mal durch nen Tick-Counter mit 'ner loop x 5.000.000 ich garantier dir der Unterschied ist riesig.
function EH_QuadUnderScoreFillerBy8(Const Text: String): String;
type PMyQuadMover = {$IFDEF UNICODE}PUInt64{$ELSE}PLongWord{$ENDIF}; var Src, Dest, PEnd: PChar; SrcLen: Integer; begin if Text = '' then Result :='' else begin SrcLen := PLongInt(NativeUInt(Text) - SizeOf(LongInt))^; //fast get src length Src := Pointer(Text); PEnd := Src+SrcLen-9; if (Pointer(Result) = nil) or //result unassigned? (PLongInt(NativeUInt(Result) - SizeOf(LongInt))^ <> SrcLen) {PStrRec.Len} or //length different? (PLongInt(NativeUInt(Result) - (SizeOf(LongInt) shl 1))^ <> 1) {PStrRec.RefCnt} then //no unique string? SetLength(Result,SrcLen+((SrcLen-1) shr 2)); Dest := Pointer(Result); while (Src <= PEnd) do begin//making a octed processing loop PMyQuadMover(Dest)^ := PMyQuadMover(Src)^; (Dest+4)^ := '_'; PMyQuadMover(Dest+5)^ := PMyQuadMover(Src+4)^; (Dest+9)^ := '_'; Inc(Dest, 10); Inc(Src, 8); end; Inc(PEnd, 8); if ((Src+4) <= PEnd) then begin//making final quad move PMyQuadMover(Dest)^ := PMyQuadMover(Src)^; (Dest+4)^ := '_'; Inc(Dest, 5); Inc(Src, 4); end; while Src < PEnd do //processing final chars begin Dest^ := Src^; Inc(Src); Inc(Dest); end; Dest^ := Src^; //null term save end; end; Das gilt im PurePascal erst mal zu Schlagen! Wer traut sich? Gruß vom ZeosDevTeam Edit: a shr vs shl war verdreht, sorry sonst funzt das "Reuse-Result" nicht |
AW: Leerzeichen in String einfügen
Zitat:
|
AW: Leerzeichen in String einfügen
Zitat:
A: Surrogates und bei ANSI die MultiByte-Zeichensätze > ![]() B: Ä kann auch als A mit ¨ geschrieben werden > ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
AW: Leerzeichen in String einfügen
Zum Spaß, hab ich mal ne kleine Benchmark Sache gemacht..
Zitat:
@Sir Rufo Darf ich deine Resultate zum Spaß beihängen? Habe ne kleine Test-Unit gebastelt. Mit deiner StrInsertEveryNthPos function.. :pale: Sonst würd ich die wieder rausnehmen :cyclops: und nur für Maverik der Validierung halber anhängen.. |
AW: Leerzeichen in String einfügen
Wieso denn nicht? :stupid:
Keine Hemmungen ... das halte ich schon aus :wink: |
AW: Leerzeichen in String einfügen
Zitat:
1. Zeig mal Deine Testroutine. 2. Vergleiche mal die Version mit der Insert variante. 3. Schreibe bitte meinen Nickname richtig... Danke |
AW: Leerzeichen in String einfügen
Liste der Anhänge anzeigen (Anzahl: 1)
@Sir Rufo
:thumb: fair und kannst was wegstecken! Vorab, in !Mavarik!'s und deinen Versionen habe ich kleine compilierungs Änderungen gemacht. Gibt es da Einwände ... sofort losbrüllen! :shock: Mein altes XE hat's nicht fressen wollen. geht los habe den Shift auf 12 erhöht (siehe Test): Zitat:
Eine Validierung fehlt, da dies die "reine" Geschwindigkeit verfälscht. @Mav die Funktionen mit den inserts hab ich gleich weggelassen. Darfst sie aber gerne hinzufügen, wenn die Autoren nix dagegen haben. |
AW: Leerzeichen in String einfügen
Liste der Anhänge anzeigen (Anzahl: 1)
Hab mal das insert von Dejan Vu in gefixter Version hinzugefügt, Mavarik's Version gefixt und meine Änderung an Sir Rufo's version kontrolliert und überarbeitet..
Das insert() kommt, wie erwartet, im Vergleich nach gefühlten Jahren wieder.. Edit: Wird es überhaupt mit der Aufage fertig? Ich habs nach 30min abgebrochen. Alle Funktionen liefern nun gültige Resultate. Neue Verison ist angehängt. Wer keine Zeit hat, kommentiert die insert Version aus. |
AW: Leerzeichen in String einfügen
Liste der Anhänge anzeigen (Anzahl: 1)
Sitze grad beim Abendessen.
:oops::oops: Sorry, da Fehler in meiner letzten Version, welche ich hochgeladen und deren Resultate gepostet habe.. habe den DupeString Shift auf 10 limitiert, um mal bei der Insert-Variante noch vor morgen früh ein Ergebnis zu bekommen: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:16 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