![]() |
Re: [Bitte optimieren] Explode Prozedur - Reloaded
Version 1.1 enthält einen Bug in TStringDivider.Prepare
Falls Length(fPattern)= 1 ist erbigt fPatternLength2 = -1 was zu einem "Integer overflow" führt, da fPatternLength2 als Cardinal deklariert ist. Bugfix: Überprüfen, ob fPattern > 1
Delphi-Quellcode:
If length(fPattern) > 1 Then
fPatternLength2 := fPatternLength - 2;
Delphi-Quellcode:
Procedure TStringDivider.Prepare;
//.. Begin fPatternLength := Length(fPattern); fPatternLength1 := fPatternLength - 1; fPatternLength2 := fPatternLength - 2; cPatternFirstChar := fPattern[1]; cPatternLastChar := fPattern[fPatternLength]; pPattern := @fPattern[2]; |
Re: [Bitte optimieren] Explode Prozedur - Reloaded
API: Dieser Fehler ist zwar irrelevant, aber ein Bug ist ein Bug, und nun isser weg. Neue Version ist im ersten Post.
Elvis: Die Sache mit den finals wusste ich nicht. Mal sehen, was das bringt. Zur potentiellen ASM-Optimierung: Da es sich um eine Art 'Pos' auf Char-Ebene handelt, könnte ich mir schon vorstellen, das man hier etwas drehen könnte. Leider hab ich von Intel-ASM keinen Schimmer. ![]() |
Re: [Bitte optimieren] Explode Prozedur - Reloaded
Soo, nächste Version oben reingestellt.
|
Re: [Optimiert] Explode Prozedur - Reloaded (Ersatz für Code
sag mal ist die Funktion jetzt Fertig ?
Würde sie gerne in meinem Lazarus Projekt unter Linux einsetzten. (So Fern das geht). kann die Funktion dann auch mit sowas umgehen: testStr:='Hallo "Dies ist ein Text" hallo2' Wenn ich jetzt z.b. hallo2 aufspielten wollte müsste ich ja vohrer alle Leerzeichen zählen. Und nicht einfach sagen 1 weil nach dem ersten index würde ja jetzt hallo2 kommen. Wegen den "". |
Re: [Optimiert] Explode Prozedur - Reloaded (Ersatz für Code
Ich denke, das die Klasse funktionsfähig ist. Ich verstehe nur nicht genau, was Du mit deinem Beispiel meinst.
|
Re: [Optimiert] Explode Prozedur - Reloaded (Ersatz für Code
Ich habe jetzt folgenden String:
Hallo1 "Test1 Test2 Test3" Hallo2 Hallo3 Hallo1 ist jetzt der erste Index "Test1 Test2 Test3" ist jetzt der zweite Index Hallo2 ist der Dritte Index. Hallo3 ist der Vierte Index. sowas meinte . |
Re: [Optimiert] Explode Prozedur - Reloaded (Ersatz für Code
Dazu ist diese Explode-Funktion nicht gedacht.
|
Re: [Optimiert] Explode Prozedur - Reloaded (Ersatz für Code
@mimi: Das solltest du mit einer Stringlist lösen können.
Delphi-Quellcode:
Der Code ist aber ungetestet!
var sl : TStringlist;
begin sl := TStringlist.Create(); try sl.Delimiter := #32; sl.DelimitedText := 'Hallo1 "Test1 Test2 Test3" Hallo2 Hallo3'; // sl[0] ist jetzt Hallo1 //sl[1] ist Test1 Test2 Test3 //sl[2] ist Hallo2 //sl[3] ist Hallo3 finally FreeAndNil(sl); end; end; |
Re: [Optimiert] Explode Prozedur - Reloaded (Ersatz für Code
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
Ich hab gerade bei der einen Fehler in der Procedure QSExplode endeckt, und zwar kommt es manchmal zu einem "Fehler bei Bereichsprüfung"
Delphi-Quellcode:
Ich hab mal ein Beispielprojekt gemacht den Fehler zu veranschaulichen.
Procedure TStringDivider.QSExplode(Const aText: String; aItems: TStrings);
// ... While i <= k Do Begin If (fPatternFirstChar = aText[i]) And (fPatternLastChar = aText[i + fPatternLength1]) Then If (fPatternLength < 3) Or CompareMem(@aText[i + 1],fPatternPtr,fPatternLength2) Then Begin aItems.Add(Copy(aText,iTextStart,i - iTextStart)); inc(i,fPatternLength); iTextStart := i; Continue; End; inc(i,fSkip[aText[i + fPatternLength]]); //<-- Hier Tritt der Fehler auf End; // ... |
Re: [Optimiert] Explode Prozedur - Reloaded (Ersatz für Code
Hallo, das Problem ist bekannt und beseitigt. Ich lade mal die aktuelle Version hoch. Nebenbei tritt der Fehler nicht auf, wenn Du die Bereichsprüfung ausschaltest. Korrekt ist das aber nicht.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 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