Deutsch
Forum

String in einzelne Buchstaben zerlegen

 
- Seite 1 -



Jörg
Sellmeyer
Gibts eine schnellere/kürzere Version als das hier?
KompilierenMarkierenSeparieren
Set("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  
 



 
- Seite 1 -



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

KompilierenMarkierenSeparieren
Proc Zerlege3

    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

 
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?
 
08.08.2008  
 



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




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  
 



 
- Seite 2 -



Kann jemand erklären, warum der erste Durchgang deutlich schneller ist?


IMHO wegen Delphi, es nutzt eine sehr dynamische AnsiStringVerwaltung...
 
08.08.2008  
 




Frank
Abbing
Die Umwandlung in einen Unicodestring dürfte nicht mehr zu toppen sein!
 
08.08.2008  
 




Jörg
Sellmeyer
Ja, irgendwie kommt man nicht mehr unter Null. Vielleicht schafft es ja einer, einen Algorhythmus zu schreiben, bei dem man Zeit gewinnt...
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
08.08.2008  
 



Das ist der Community-Algorithmus...
 
08.08.2008  
 



Frank Abbing
Die Umwandlung in einen Unicodestring dürfte nicht mehr zu toppen sein!


Hat aber auch einen Nachteil, denn "XProfanstrings" sind binärsicher, Zerlege1-4 auch, Zerlege5 nicht - schliesslich wird hier mit z aufgefüllt und geht wegen dem Translate aus dem Orginalstring verloren. Nichts ist für alles gut.
 
08.08.2008  
 




Jörg
Sellmeyer
Für meinen Zweck ist es hervorragend, da ich nur Zahlen in den Strings habe.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
08.08.2008  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

5.286 Betrachtungen

Unbenanntvor 0 min.
RudiB.26.04.2022
Manfred Barei18.11.2018
Heiko Dix13.11.2012
Frank Vorholzer24.05.2012

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie