Seite 3 von 4
Verfasst: 05.02.2008 17:37
von AND51
Andreas_S hat geschrieben:AND51 hat geschrieben:> Mir ist geschwindigkeit auch wichtig
Ich seh schon, wir verstehen uns^^ Gefällt mir, deine Einstellung
Genau
Also als erstes achte ich immer auf Sicherheit, also dass mein Code mit
EnableExplicit und Unicode zurechtkommt,
Protected benutzt, und so weiter.
Das ist ja relativ einfach zu bewerkstelligen, dann kann der Speed kommen.
Achtung, Andreas_S, dein Code ist etwas buggy:
Probier mal
Daraus wird
ABc
Das hast du bei deinem Code nicht gesehen, weil dem Text ein '<' voransteht.
Verfasst: 05.02.2008 20:33
von Andreas_S
Code: Alles auswählen
Procedure.s irgendeinBefehl( str.s )
Protected *ptr.CHARACTER = @str, space = 1
While *ptr\c
If *ptr\c = 32
space = 1
Else
If space = 1
If (*ptr\c >= 97) And (*ptr\c <= 122)
*ptr\c - 32
space = 0
EndIf
EndIf
EndIf
*ptr + SizeOf(CHARACTER)
Wend
ProcedureReturn str
EndProcedure
Debug irgendeinBefehl("abc")

Bei mir kommt da "Abc" raus...
Ja Protected ist bei mir auch pflicht...
EnableExplicit ist bei mir nicht so wichtig (Basic aufjedenfall, bei Java und C++ ist das so oder so standart. Vil. verwend ichs jetzt...).
Verfasst: 05.02.2008 20:41
von AND51
Komisch... Ich hatte es zugegeben nur mit deinem Beispiel getestet und darauf spekuliert, dass es mit "abc" genauso sein muss.
Probier selbst und du siehst, aus "dies" wird "DIes"
Code: Alles auswählen
Procedure.s irgendeinBefehl( str.s )
Protected *ptr.CHARACTER = @str, space = 1
While *ptr\c
If *ptr\c = 32
space = 1
Else
If space = 1
If (*ptr\c >= 97) And (*ptr\c <= 122)
*ptr\c - 32
space = 0
EndIf
EndIf
EndIf
*ptr + SizeOf(CHARACTER)
Wend
ProcedureReturn str
EndProcedure
Debug irgendeinBefehl("<Dies 'ist #ein +testtext, ~um 3zu 4zeigen &was (passierte")
PB 4.20 BETA 2
Verfasst: 05.02.2008 20:52
von Andreas_S
Da hast du recht...
Ich mach was dagegen^^
Andreas
Verfasst: 05.02.2008 20:58
von HeX0R
AND51 hat geschrieben:
Probier selbst und du siehst, aus "dies" wird "DIes"
Soso und bei dir sieht es besser aus ?
Code: Alles auswählen
Procedure.s Capitalize(text.s)
Protected *pos.Character=@text
While *pos\c
While *pos\c < 'a' Or *pos\c > 'z'
*pos+SizeOf(Character)
Wend
*pos\c-32
While (*pos\c >= 'a' And *pos\c <= 'z') Or (*pos\c >= 'A' And *pos\c <= 'Z')
*pos+SizeOf(Character)
Wend
Wend
ProcedureReturn text
EndProcedure
Debug Capitalize("<Dies 'ist #ein +testtext, ~um 3zu 4zeigen &was (passierte")
Verfasst: 05.02.2008 21:18
von AND51
Tatsache, ist mir nicht aufgefallen!
Komisch!
Werds mal irgendwie korrigieren!
Verfasst: 05.02.2008 22:42
von Andreas_S
Das was Kiffi meinte:
Code: Alles auswählen
Procedure.s irgendeinBefehl( str.s )
Protected *ptr.CHARACTER = @str, isSeperator.b = 1, if1.b, if2.b
While *ptr\c
if1 = *ptr\c > 96 And *ptr\c < 123
if2 = *ptr\c > 64 And *ptr\c < 91
If if1 Or if2
If if1 And isSeperator
*ptr\c - 32
ElseIf if2 And Not isSeperator
*ptr\c + 32
EndIf
isSeperator = 0
EndIf
If *ptr\c = 32
isSeperator = 1
EndIf
*ptr + SizeOf(CHARACTER)
Wend
ProcedureReturn str
EndProcedure
Debug irgendeinBefehl("<DiES 'isT #eIn +testText, ~um 3zu 4zEigen &wAs (paSsierte")
Ist leider noch eine Spur langsamer...
Glaub aber das man das nicht mehr schneller machen kann, es seidenn es kann mir jemand das gegenteil beweisen^^
Andreas
Verfasst: 05.02.2008 22:51
von Kiffi
Andreas_S hat geschrieben:Das was Kiffi meinte:
wahrscheinlich zu kompliziert gedacht.
Code: Alles auswählen
Procedure.s irgendeinBefehl( str.s )
str = LCase(str)
; Hier geht Andreas' Kram los
; [...]
ProcedureReturn str
EndProcedure
(ob's schneller ist, weiß ich nicht...)
Grüße ... Kiffi
Verfasst: 05.02.2008 22:59
von Andreas_S
Denk nicht das das schneller ist, weil LCase(str) so oder so eine schleife durch den ganzen string läuft.
Dann hab ich genauso eine schleife. Wenn ich dann noch meine voherige Prozedure drüber laufen lasse dann dauert das schätzungsweise 2x so lang...
Aber gute Idee, wäre selbst nicht draufgekommen das das auch so gehn könnte...
Andreas
Verfasst: 05.02.2008 23:08
von HeX0R
Meins is schneller
Code: Alles auswählen
Procedure.s irgendeinBefehl( str.s )
Protected *ptr.CHARACTER = @str, isSeperator.b = 1, if1.b, if2.b
While *ptr\c
if1 = *ptr\c > 96 And *ptr\c < 123
if2 = *ptr\c > 64 And *ptr\c < 91
If if1 Or if2
If if1 And isSeperator
*ptr\c - 32
ElseIf if2 And Not isSeperator
*ptr\c + 32
EndIf
isSeperator = 0
EndIf
If *ptr\c = 32
isSeperator = 1
EndIf
*ptr + SizeOf(CHARACTER)
Wend
ProcedureReturn str
EndProcedure
Procedure.s wasnlos(str.s)
Protected *ptr.CHARACTER = @str - SizeOf(CHARACTER), space.l
Repeat
*ptr + SizeOf(CHARACTER)
If *ptr\c = 0
Break
ElseIf *ptr\c = 32
space = 0
Continue
ElseIf space = 0
If *ptr\c > 64 And *ptr\c < 91
space = 1
Continue
ElseIf *ptr\c < 97 Or *ptr\c > 122
Continue
EndIf
*ptr\c ! $20
space = 1
ElseIf *ptr\c > 64 And *ptr\c < 91
*ptr\c | $20
EndIf
ForEver
ProcedureReturn str
EndProcedure
#CheckIT = "<DiES 'isT #eIn +testText, ~um 3zu 4zEigen &wAs (paSsierte"
CompilerIf #PB_Compiler_Debugger
Debug irgendeinBefehl(#CheckIT)
Debug wasnlos(#CheckIT)
End
CompilerEndIf
startTime = ElapsedMilliseconds()
For i = 0 To 10000000
irgendeinBefehl(#CheckIT)
Next
time1 = ElapsedMilliseconds() - startTime
startTime = ElapsedMilliseconds()
For i = 0 To 10000000
wasnlos(#CheckIT)
Next
time2 = ElapsedMilliseconds() - startTime
MessageRequester("Andreas_S vs. HeX0R","Andreas_S: " + Str(time1) + #LF$ + "HeX0R: " + Str(time2))