|  | 
|   | 
 | 
  Jörg Sellmeyer | Gibts eine schnellere/kürzere Version als das hier? KompilierenMarkierenSeparierenSet("Decimals",0)
Proc Zerlege1
    Parameters Text$,Trenner$
    Declare Ergebnis$
    WhileLoop Len(Text$)
        Ergebnis$ = Ergebnis$ + Mid$(Text$,&Loop,1) + Trenner$
    Wend
    Return Ergebnis$
EndProc
Proc Zerlege2
    Parameters Text$,Trenner$
    Declare Ergebnis$
    WhileLoop Len(Text$)
        Ergebnis$ = Ergebnis$ + SubStr$(Text$,&Loop) + Trenner$
    Wend
    Return Ergebnis$
EndProc
Proc Zerlege3
    Parameters Text$,Trenner$
    Declare Ergebnis$,c&
    c&=len(text$)-1
    WhileLoop c&,1,-1
        Text$ = Ins$(Trenner$,Text$,&loop)
    Wend
    Return Text$
EndProc
Proc Zerlege4
    Parameters t$,u$
    declare e$,f&
    f&=Addr(t$)
    whileloop 0,Len(t$)-1
        e$=e$+Char$(f&,&Loop,1)+u$
    endwhile
    Return e$
endproc
Def MultiByteToWideChar(6) !"Kernel32","MultiByteToWideChar"
Proc Zerlege5
    Parameters Text$,Trenner$
    Declare c&,b#
    c& = Len(Text$) * 2 + 1
    Dim b#,c&
    MultiByteToWideChar(0,0,Addr(Text$),Len(Text$),b#,c& )
    Text$ = Translate$(Char$(b#,0,c& - 1),"z","|")
    Return Text$
EndProc
Cls
Var a& = &GetTickCount
ClearClip
PutClip "Z01 Z02 Z03 Z04 Z05
"
WhileLoop 5
    Zerlege1(MkStr$("ABCDEFGHIJKLMNOP",200),"|")
    PutClip  Str$(&GetTickCount - a&) + " "
    a& = &GetTickCount
    Zerlege2(MkStr$("0123456789012345",200),"|")
    PutClip  Str$(&GetTickCount - a&,) + " "
    a& = &GetTickCount
    Zerlege3(MkStr$("QRSTUVWXYZÄÖÜß@A",200),"|")
    PutClip  Str$(&GetTickCount - a&) + " "
    a& = &GetTickCount
    Zerlege4(MkStr$("0987654321098765",200),"|")
    PutClip  Str$(&GetTickCount - a&) + " "
    a& = &GetTickCount
    Zerlege5(MkStr$("qjeudkfotlgkcjdh",200),"|")
    PutClip  Str$(&GetTickCount - a&) + "
    "
    WindowTitle Str$(&Loop)
Wend
Print GetClip$()
WaitInput
 |  
  | 
|   | 
 | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ...    | 08.08.2008  ▲ |  
  | 
|   | 
 
 
  | 
 | 
  | vielleicht statt WhileLoop Len(Text$)
  var c&=len(text$)-1 whileLoop c&,1,-1
  und statt Ergebnis$ = Ergebnis$ + Mid$(Text$,&Loop,1) + Trenner$
  Ergebnis$ = ins$(trenner$,text$,&loop)
  bin leider grad zeitlich sehr eingespannt... |  
  | 
|   | 
 |  | 
|   | 
 
 
  | 
 | 
  | Nachtrag: Bug im XProfan: print sizeOf(explode("12:34",":")) gibt 4 aus statt 2. Mir ist klar weshalb es das tut (sizeof auf long), richtig ists aber nicht.
  Nachtrag: print sizeOf(explode("",".")) gibt (natürlich dann) auch 4 aus, statt <b><u>NULL</u></b> (aber das mit der fehlenden NULL bei Explode wünscht Roland ja so) |  
  | 
|   | 
 |  | 
|   | 
 
 
  | 
 | 
  Jörg Sellmeyer | iF
 Nachtrag: Bug im XProfan: print sizeOf(explode("12:34",":")) gibt 4 aus statt 2. Mir ist klar weshalb es das tut (sizeof auf long), richtig ists aber nicht. 
  Wieso Bug? Von was willst Du denn da die Größe ermitteln? Von der Funktion SizeOf? Oder meinst Du Profan sollte da mit einer Fehlermeldung reagieren?
  Muß jetzt mal Dein Beispiel testen. |  
  | 
|   | 
 | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ...    | 08.08.2008  ▲ |  
  | 
|   | 
 
 
  | 
 | 
  | Explode Ergebnis: Dynamisches String-Array
  explode liefert ein Array zurück, Arrays können in Arrays übergeben werden. Ein sizeOf auf ein Array sollte die Anzahl der Einträge zurückliefern - keine Bandbreite.
  Mir ist klar wie Roland das gelöst hat, aber hier fehlen einfach noch ein Paar Ausnahmendeklarationen. |  
  | 
|   | 
 |  | 
|   | 
 
 
  | 
 | 
  Jörg Sellmeyer | So hier mal ein Statistikdurchlauf. Seltsamerweise ist die erste Version beim ersten Durchlauf ähnlich schnell, wie Nr zwei. Bei weiteren Durchläufen braucht sie fast doppelt so lange. Deine Version (#3) scheint die schnellst zu sein. Ich vergesse immer wieder, daß es Ins$ überhaupt gibt. KompilierenMarkierenSeparierenSet("Decimals",0)
Proc Zerlege1
    Parameters Text$,Trenner$
    Declare Ergebnis$
    WhileLoop Len(Text$)
        Ergebnis$ = Ergebnis$ + Mid$(Text$,&Loop,1) + Trenner$
    Wend
    Return Ergebnis$
EndProc
Proc Zerlege2
    Parameters Text$,Trenner$
    Declare Ergebnis$
    WhileLoop Len(Text$)
        Ergebnis$ = Ergebnis$ + SubStr$(Text$,&Loop) + Trenner$
    Wend
    Return Ergebnis$
EndProc
Proc Zerlege3
    Parameters Text$,Trenner$
    Declare Ergebnis$,c&
    c&=len(text$)-1
    WhileLoop c&,1,-1
        Text$ = Ins$(Trenner$,Text$,&loop)
    Wend
    Return Text$
EndProc
Cls
Var a& = &GetTickCount
ClearClip
PutClip "Z01 Z02 Z03
"
WhileLoop 10
    Zerlege1(MkStr$("ABCDEFGHIJKLMNOP",200),"|")
    PutClip  Str$(&GetTickCount - a&) + " "
    a& = &GetTickCount
    Zerlege2(MkStr$("0123456789012345",200),"|")
    PutClip  Str$(&GetTickCount - a&,) + " "
    a& = &GetTickCount
    Zerlege3(MkStr$("QRSTUVWXYZÄÖÜß@A",200),"|")
    PutClip  Str$(&GetTickCount - a&) + "
    "
    WindowTitle Str$(&Loop)
Wend
Print GetClip$()
WaitInput
 Ergebnisse:
 Z01 Z02 Z03
  375 250 187
  516 406 375
  875 515 360
  875 500 375
  875 516 375
  875 500 375
  891 500 375
  875 500 375
  890 500 375
  875 516 375
 
   |  
  | 
|   | 
 | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ...    | 08.08.2008  ▲ |  
  | 
|   | 
 
 
  | 
 | 
  RGH | @iF: Zu SizeOf() aus der Hilfe:
  @SizeOf(V) V : Name einer Variablen Ergebnis: Longint
  Beachte die Beschreibung des Parameters! Man sollte die Funktion schon so nutzen, wie sie gedacht ist und nicht wie man sie vielleicht gerne hätte! Für etwas anderes als einen Variablenbezeichner als Parameter ist die Funktion schlicht nicht definiert.
  Gruß Roland |  
  | 
|   | 
 | Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4  | 08.08.2008  ▲ |  
  | 
|   | 
 
 
  | 
 | 
  Jac de Lad |  | 
|   | 
 | Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP  | 08.08.2008  ▲ |  
  | 
|   | 
 
 
  | 
 | 
  | | Zerlege3 gibt es bereits, wie viel Zeit benötigt Dein "Zerlege4" im Ggs. zum Zerlege3 Jac? |  
  | 
|   | 
 |  | 
|   | 
 
 
  | 
 | 
  | Nachtrag: @Jörg: Habe noch eine Idee welche vielleicht schneller ist als alle anderen bisherigen hier geposteten Algos.
  Den String einfach in einen WideString konvertieren und per Translate die Nullen ersetzen...
  Somit wäre das Meiste auf native Abarbeitung gelagert, also sehr fix... - und man benötigt keine Schleife mehr. |  
  | 
|   | 
 |  | 
|   | 
 
 
  | 
 | 
  Jörg Sellmeyer | Jacs Version ist etwas schneller als meine beiden, aber langsamer als die von David:
 Z01 Z02 Z03 Z04
  375 266 171 344
  782 500 359 484
  984 516 375 469
  969 500 375 469
  969 515 360 437
  703 250 218 360
  829 515 360 375
  625 250 187 234
  609 438 375 469
  969 515 375 469
 
   Jetzt werde ich noch die WideString-Variante testen. Kann jemand erklären, warum der erste Durchgang deutlich schneller ist? Das ist auch so, wenn ich statt PutClip, das jeweils sowort auf den Schirm bringe. Ich hätte eher erwartet, daß es schneller wird.
  Nachtrag: Super! MultiByteToWideChar ist es:
 Z01 Z02 Z03 Z04 Z05
  375 250 203 266 15
  265 250 297 469 0
  516 500 375 468 0
  516 500 375 469 15
  515 500 391 469 0
  
  Oben im ersten Beitrag habe ich alle Versionen zusammengefaßt. |  
  | 
|   | 
 | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ...    | 08.08.2008  ▲ |  
  | 
|   | 
 
 
  | 
 | 
  Jac de Lad | @iF: Hat sich ja schon erledigt.   |  
  | 
|   | 
 | Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE) Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP  | 08.08.2008  ▲ |  
  | 
|   | 
 
 
  |