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
Gültigen VariablenNamen erkennen.
ah stimmt.. wusste nicht das es den FLAG 1 gibt.
Ist dann wahrscheinlich "Modifier i (ignore case)" ....
Ist dann wahrscheinlich "Modifier i (ignore case)" ....
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Re: Gültigen VariablenNamen erkennen.
nochmal ein genereller hinweis...
demo:
würde der Boole'sche Ausdruck korrekt ausgewertet, müßte da 1 oder -1 rauskommen.
also solche Konstrukte besser vermeiden.
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
demo:
Code: Alles auswählen
a = 4
b = 5
Debug (a<b)also solche Konstrukte besser vermeiden.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
-
Little John
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).
Hier ist RegEx am schnellsten, komisch.
Gruß, Little John
Code: Alles auswählen
cx 3078
ts 18140
regex 2422Hier ist RegEx am schnellsten, komisch.
Gruß, Little John
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Guck 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
Der dritte Wert ist TS
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

-
Little John
-
Little John
Meine Idee war, durch Löschen von Bit 5 praktisch UCase() mit dem ASCII-Wert zu machen. Der Code ist aber nicht schneller (also ist lj > ts
). Hier trotzdem falls es jemanden interessiert meine Prozedur isValidVariableName4(), und der alte Testcode etwas aufgeräumt und konsistent nummeriert. 
Gruß, Little John
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))Re: Gültigen VariablenNamen erkennen.
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 )
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
den Tipp hast du doch von mir, Scherzkeks. 
... davon ab, ist das ein "hack" oder "dirty workaround", ohne anspruch oder garantie auf funktionalität.
dazu hat sich mit 4.3 etwas an der verarbeitung der pseudo-boole'schen ausdrücke geändert,
also kann ich dir jetzt nicht sagen, ob der alte häck noch funktioniert.
grundsätzlich, egal ob der häck noch funktioniert oder nicht, ist das Macro wie es vorliegt falsch,
die idee dahinter geht von falschen voraussetzungen aus, und das musste aufgeklärt werden.
auch wenn er jetzt sowieso eine andere lösung wählt, muss er wissen, dass er so konstrukte vermeiden sollte.
... davon ab, ist das ein "hack" oder "dirty workaround", ohne anspruch oder garantie auf funktionalität.
dazu hat sich mit 4.3 etwas an der verarbeitung der pseudo-boole'schen ausdrücke geändert,
also kann ich dir jetzt nicht sagen, ob der alte häck noch funktioniert.
grundsätzlich, egal ob der häck noch funktioniert oder nicht, ist das Macro wie es vorliegt falsch,
die idee dahinter geht von falschen voraussetzungen aus, und das musste aufgeklärt werden.
auch wenn er jetzt sowieso eine andere lösung wählt, muss er wissen, dass er so konstrukte vermeiden sollte.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.