Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Problem mit procedure Split() (https://www.delphipraxis.net/160107-problem-mit-procedure-split.html)

uragan 27. Apr 2011 20:20

Delphi-Version: 5

Problem mit procedure Split()
 
Hallo

Ich hoffe ich bin hier richtig.
Ich hab ein kleines problem mit der Funktion Split()

was ist den hier falsch?, wieso bekomme ich das ganze nicht gesplittet?

Delphi-Quellcode:
program uragan;

var
list: TStringList;
s : string;
i : integer;

procedure Split(const Delimiter: Char; Input: string; const Strings: TStrings);
begin
   Strings.Clear;
   Strings.Delimiter := Delimiter;
   Strings.DelimitedText := Input;
end;



begin
list := TStringList.create;
s := 'blabla' + HStr('00') + 'blabla2' + HStr('00') + 'blabla3' + HStr('00') + 'blabla4' + HStr('00') + 'blabla5' + HStr('00') ;
Split(HStr('00'), s, list);
for i := 0 to list.count-1 do begin
ShowMessage(list[i]);
end;

end.

mkinzler 27. Apr 2011 20:30

AW: Problem mit procedure Split()
 
Was kommt den raus?

Klaus01 27. Apr 2011 20:38

AW: Problem mit procedure Split()
 
Guten Abend,

was macht denn HStr('00')?
Ist es das gleiche wie #0?

Warum sind Strings in der Paramterliste der Prozedur split als const deklariert?

Grüße
Klaus

EWeiss 27. Apr 2011 21:35

AW: Problem mit procedure Split()
 
changed..

gruss

uragan 27. Apr 2011 21:45

AW: Problem mit procedure Split()
 
Zitat:

Zitat von mkinzler (Beitrag 1097270)
Was kommt den raus?

Es kommen 2 arrays

array0 = blabla
array1 = ?? ist frei, wahrscheinlich #0
mehr kommt nicht

wenn ich Split string ändere, zb auf ","dann klappt es, es muss aber HStr('00')bzw #0 sein

ConnorMcLeod 28. Apr 2011 04:13

AW: Problem mit procedure Split()
 
Hallo,

es kommen nicht *zwei Arrays*, sondern zwei Einträge in einer TStringList. Einer gleicht 'blabla' und einer ist ein Leerstring.

Mach einen Breakpoint auf
Strings.DelimitedText := Input;
und steppe mal mit F7 durch. Dann wird Dir klar, was passiert. Kurz gesagt: #0 geht halt nicht.

Antwort1) der Delimiter darf bei dieser Vorgehensweise nicht #0 sein.
Antwort2) eine TStringList für diesen Zweck zu verwenden ist super praktisch und super Performance fressend.

Mir hat eine Funktion auf Stackoverflow ganz gut gefallen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  MYDELIMITER = #0;
var
  s  : string;
  sTok: string;
  i  : integer;

  function GetTok(const Line: string; const Delim: Char; const TokenNum: Byte): string;
  { LK Nov 8, 2009 - Reoptimized using PChars instead of calls to Pos and PosEx }
  { See; http://stackoverflow.com/questions/1694001/is-there-a-fast-gettoken-routine-for-delphi }
  var
    I, CurToken: Integer;
    PLine, PStart: PChar;
  begin
    CurToken := 1;
    PLine := PChar(Line);
    PStart := PLine;
    for I := 1 to length(Line) do begin
      if PLine^ = Delim then begin
        if CurToken = TokenNum then
          break
        else begin
          CurToken := CurToken + 1;
          inc(PLine);
          PStart := PLine;
        end;
      end
      else
        inc(PLine);
    end;
    if CurToken = TokenNum then
      SetString(Result, PStart, PLine - PStart)
    else
      Result := '';
  end;

begin
  s := 'blabla' + MYDELIMITER + 'blabla2' + MYDELIMITER + 'blabla3' + MYDELIMITER + 'blabla4' + MYDELIMITER + 'blabla5' + MYDELIMITER ;

  i := 1;
  sTok := GetTok(s, MYDELIMITER, i);
  while ('' <> sTok) do
  begin
    ShowMessage(sTok);
    inc(i);
    sTok := GetTok(s, MYDELIMITER, i);
  end;
end;
HTH

FredlFesl 28. Apr 2011 06:56

AW: Problem mit procedure Split()
 
Deine Funktion kommt nur mit kurzen Strings klar und ist vom Aufwand O(n^2), weil für jedes Token immer von Anfang an gesucht wird. Ob das Schneller ist, bezweifle ich mal ganz stark.
Im Gegensatz dazu ist die TStringList-Geschichte sehr viel mächtiger, denn sie kommt mit allen Stringtypen und mit in Gänsefüschen eingeschlossenen Texten klar, z.B. wird
Delphi-Quellcode:
a,"b,c",d
in drei Strings ("a", "b,c" und "d") aufgeteilt.

Der Code von TStringlist sieht auch ganz schön flott aus.

Klaus01 28. Apr 2011 07:38

AW: Problem mit procedure Split()
 
..alternativ könntest Du auch mal diese Explode-Prozedur oder diese explode Funktion testen.

Grüße
Klaus

himitsu 28. Apr 2011 07:52

AW: Problem mit procedure Split()
 
Wer eine Stringliste als Splitter nutzt, der sollte sich von #0 als Trenner verabschieden.
Alles, was intern PChar nutzt oder eine Kompatibilität zu diesem bietet, das kann nich genutzt werden.

#0 = Textende

also weiter macht die Stringliste auch nicht

mkinzler 28. Apr 2011 08:24

AW: Problem mit procedure Split()
 
Es scheint sich aber um eine C-Stringliste zu handeln. Dort wird m.W. #0 als Trenner verwendet


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:28 Uhr.
Seite 1 von 5  1 23     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