Delphi-PRAXiS
Seite 2 von 8     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   [Optimiert] Explode Prozedur - Reloaded (Ersatz für CodeLib) (https://www.delphipraxis.net/82268-%5Boptimiert%5D-explode-prozedur-reloaded-ersatz-fuer-codelib.html)

API 13. Dez 2006 04:33

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];

alzaimar 13. Dez 2006 07:44

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.

Hier gibt es die FastStrings-Toolsammlung, die Stringfunktionen in ASM implementiert, vielleicht kann man sich hier etwas abkupfern.

alzaimar 13. Dez 2006 21:39

Re: [Bitte optimieren] Explode Prozedur - Reloaded
 
Soo, nächste Version oben reingestellt.

mimi 18. Jul 2007 18:32

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

alzaimar 18. Jul 2007 21:27

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.

mimi 18. Jul 2007 21:57

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 .

alzaimar 19. Jul 2007 09:49

Re: [Optimiert] Explode Prozedur - Reloaded (Ersatz für Code
 
Dazu ist diese Explode-Funktion nicht gedacht.

hitzi 19. Jul 2007 11:14

Re: [Optimiert] Explode Prozedur - Reloaded (Ersatz für Code
 
@mimi: Das solltest du mit einer Stringlist lösen können.

Delphi-Quellcode:
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;
Der Code ist aber ungetestet!

C.Schoch 23. Dez 2007 11:56

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:
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;
// ...
Ich hab mal ein Beispielprojekt gemacht den Fehler zu veranschaulichen.

alzaimar 23. Dez 2007 13:37

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 17:49 Uhr.
Seite 2 von 8     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz