Schreibweise ändern (so geht das <> So Geht Das)...?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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 :allright:
Genau :allright:
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

Code: Alles auswählen

Debug irgendeinBefehl("abc")
Daraus wird
ABc
Das hast du bei deinem Code nicht gesehen, weil dem Text ein '<' voransteht.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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...).
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Da hast du recht...
Ich mach was dagegen^^

Andreas
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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")
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Tatsache, ist mir nicht aufgefallen!
Komisch! :o
Werds mal irgendwie korrigieren!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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... :allright:

Andreas
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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))
Antworten