Verfasst: 30.09.2008 16:58
Nein das fehlt nichtSTARGÅTE hat geschrieben:@edel
pass mal deine Abfrage an (zB wie meine), denn sonst bekommt "GroßeVar" auch ein TRUE
EDIT : und große Buchstaben werden bei dir nun auch FALSE
A-Z fehlt noch
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
Nein das fehlt nichtSTARGÅTE hat geschrieben:@edel
pass mal deine Abfrage an (zB wie meine), denn sonst bekommt "GroßeVar" auch ein TRUE
EDIT : und große Buchstaben werden bei dir nun auch FALSE
A-Z fehlt noch
dein Macro versucht, Boole'sche Ausdrücke zu verwenden. Die werden aber in PB nicht unterstützt.cxAlex hat geschrieben:Code: Alles auswählen
Macro isValidChar(_Char) ; Gültige Zeichen ((_Char<58) And (_Char>47)) Or ((_Char<123) And (_Char>96)) Or ((_Char<91) And (_Char>64)) Or _Char = 95 EndMacro
Code: Alles auswählen
a = 4
b = 5
Debug (a<b)Code: Alles auswählen
cx 3078
ts 18140
regex 2422Guck Dir mal den Testcode anLittle John hat geschrieben:Ich bekomme mit cxAlex' Testcode aus dem Posting von heute um 17:55:31 folgende Zeiten ( bei ausgeschaltetem Debugger):
(PB 4.20 unter Windows XP).Code: Alles auswählen
cx 3078 ts 18140 regex 2422
Hier ist RegEx am schnellsten, komisch.
Gruß, Little John
Ich habe mir den Testcode wirklich nicht angekuckt, sondern ihn nur "abgespielt".ts-soft hat geschrieben:Guck Dir mal den Testcode an
Code: Alles auswählen
#n = 10000000
Global regex = CreateRegularExpression(#PB_Any,"[a-z_][a-z0-9_]*",1)
Procedure isValidVariableName1(Var.s)
If MatchRegularExpression(regex,Var)
ProcedureReturn #True
EndIf
EndProcedure
Macro isValidChar(_Char)
; Gültige Zeichen
((_Char<58) And (_Char>47)) Or ((_Char<123) And (_Char>96)) Or ((_Char<91) And (_Char>64)) Or _Char = 95
EndMacro
Procedure isValidVariableName2(*VarMem.Character)
If *VarMem\c<58 And *VarMem\c>47 ; Keine Zahlen am Anfang
ProcedureReturn 0
EndIf
While *VarMem\c
If Not isValidChar(*VarMem\c) ; Jedes Zeichen prüfen.
ProcedureReturn 0
EndIf
*VarMem + 1
Wend
ProcedureReturn 1 ; Variable ist ok
EndProcedure
Procedure isValidVariableName3(*VarMem.Character)
If *VarMem\c < 58 And *VarMem\c > 47 ; Keine Zahlen am Anfang
ProcedureReturn 0
EndIf
While *VarMem\c
Select *VarMem\c
Case 48 To 57, 65 To 90, 97 To 122, 95
Default
ProcedureReturn 0
EndSelect
*VarMem + 1
Wend
ProcedureReturn 1 ; Variable ist ok
EndProcedure
Procedure isValidVariableName4(*VarMem.Character)
If *VarMem\c >= '0' And *VarMem\c <= '9' ; Keine Zahlen am Anfang
ProcedureReturn 0
EndIf
While *VarMem\c
Select *VarMem\c
Case '0' To '9', '_'
Default
Select *VarMem\c & $DF ; Bit 5 löschen = UCase()
Case 'A' To 'Z'
Default
ProcedureReturn 0
EndSelect
EndSelect
*VarMem + 1
Wend
ProcedureReturn 1 ; Variable ist ok
EndProcedure
t1 = ElapsedMilliseconds()
For i = 1 To #n
isValidVariableName1("_char1")
isValidVariableName1("0invlaid")
isValidVariableName1("sehrlangername")
Next
t1 = ElapsedMilliseconds() - t1
t2 = ElapsedMilliseconds()
For i = 1 To #n
isValidVariableName2(@"_char1")
isValidVariableName2(@"0invlaid")
isValidVariableName2(@"sehrlangername")
Next
t2 = ElapsedMilliseconds() - t2
t3 = ElapsedMilliseconds()
For i = 1 To #n
isValidVariableName3(@"_char1")
isValidVariableName3(@"0invlaid")
isValidVariableName3(@"sehrlangername")
Next
t3 = ElapsedMilliseconds() - t3
t4 = ElapsedMilliseconds()
For i = 1 To #n
isValidVariableName4(@"_char1")
isValidVariableName4(@"0invlaid")
isValidVariableName4(@"sehrlangername")
Next
t4 = ElapsedMilliseconds() - t4
MessageRequester("", "regex "+Str(t1)+#LF$ + "cx "+Str(t2)+#LF$ + "ts "+Str(t3)+#LF$ + "lj "+Str(t4))Meiner Meinung nach muss man es nur "Richtig" anwenden:Kaeru Gaman hat geschrieben: demo:würde der Boole'sche Ausdruck korrekt ausgewertet, müßte da 1 oder -1 rauskommen.Code: Alles auswählen
a = 4 b = 5 Debug (a<b)
also solche Konstrukte besser vermeiden.
Code: Alles auswählen
a = 4
b = 5
Debug ( (a<b) And 1 )
Debug ( (a>b) And 1 )