Mal wieder die Makros
Aber PB optimiert
"_"+"a"+"_" vor dem Compilieren zu "_a_", also
"_"+"a"+"_" = "_a_"
Ansonst könnte man die Optimierung vergessen.
"_"+"a"+"_" vor dem Compilieren zu "_a_", also
"_"+"a"+"_" = "_a_"
Ansonst könnte man die Optimierung vergessen.
Zuletzt geändert von cxAlex am 14.03.2009 23:16, insgesamt 1-mal geändert.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Wenn der Compiler das korrekt machen würde ja ... aber es gibt ein IMA,
egal wie oft ihr behauptet es wäre das selbe ... es ist nicht das selbe weil
der Compiler das nicht schaft. Ganz einfach ...
Und für den Threadersteller hier die funktionirende Lösung.
Code: Alles auswählen
Macro DoubleQuote
"
EndMacro
Macro UnderLine
_
EndMacro
Macro DoubleUnderscore(Name)
DoubleQuote#UnderLine#Name#UnderLine#DoubleQuote
EndMacro
Procedure CallBug(Name$)
Select Name$
Case DoubleUnderscore(a)
Debug "OK - a"
;...
Case DoubleUnderscore(b)
;...
Case DoubleUnderscore(c)
;...
Case DoubleUnderscore(d)
;...
Case DoubleUnderscore(e)
;...
Case DoubleUnderscore(f)
Debug "OK - f"
;...
EndSelect
EndProcedure
CallBug("_a_")
CallBug("_f_")- 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
Also wird string arithmetik in macros nicht unterstützt. Mit diesem Wissen
kann man doch leben
kann man doch leben
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.

- 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
auch rechtPMV hat geschrieben:Nein ... in select case.
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.

-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
-
Toshy
- Beiträge: 713
- Registriert: 22.03.2005 00:29
- Computerausstattung: Computer und Strom vorhanden
- Wohnort: LK Wolfenbüttel
Hi.
Ich habe den Beitrag jetzt erst gesehen.
Also ich habe hier noch keine für mich zufrieden stellende Antwort gefunden.
DAs selbe was edel genannt hat, ist mir auch vor langem aufgefallen, muß schon einige Jahre her sein oder zumindest ein Jahr.
Alleine das
nicht funktioniert zeigt daß ein Macro nicht daß macht, was es machen sollte. Es arbeitet nicht nach dem was in der Hilfe steht.Ich vermute das die RAUTE, das verknüpfende Element nicht richtig funktioniert. die "Quelltexterkennung" (nennt man das parsen?) scheint einfach nicht zu gehen.
Testet doch mal einzeln die beiden folgenden Macros
Das erste geht nur mit der RAUTE zur anzeige, das andere löst einen Fehler aus.
IRgendwann kam ich damals auf die Idee, wenn ne Raute drinn ist, die nicht reingehört lasse ich sie im Macro weg. Das ging schief
Was aber bei mir seit dem immer wunderbar funktioniert ist
selbst das hier geht verwunderlicher weise (oder auch nicht wunderlich)
Ich denke der Quellcodewandler / parser (hoffentlich sagt mir bald einer ob der so heißt) einfach einen Fehler hat und nicht in allen Fällen erkennt wo der Macroaufruf / das Schlüsselwort anfängt und aufhört.
Vergleich hierzu folgende drei Macros
PB kommt einfach mit den "Trennzeichen" durcheinander bzw. zählt intern irgendwie nicht richtig und sindet anscheint das ende eines "Wortes" nicht immer richtig.
Mir sind da noch ein zwei andere Beispiele aufgefallen die mich stutzig gemacht haben, aber alles wollte ich jetzt doch nicht noch mal austesten.
Ich gehe also noch immer und das seit längerm vom einem Bug aus, nicht von etwas nicht unterstützt wird.
Wenn man die Hilfedatei wörtlich nimmt, müßte eigentlich der "Inhalt" jedes Schlüsselwort was im Macroaufruf steht (in der Klammer) innerhalb des Macros überall den Teil ersetzten der dem Schlüsselwort genau entspricht, sei er auch es auch nur ein Teil.
müßte eigentlich "dasnenewirmal" ausgeben. Das würde aber probleme geben weil dann teile von Schlüsselworten, die ein Teil eines anderen Schlüsselwortes sind dort auch ersetzt werden müßten. Also wird PB schauen, das es nur da greift, wo das Komplette wort übereinstimmt. Als Trennzeichen nimmt es wohl das leerzeichen(pluszeichen und wohl noch andere), was aber weiterhin mit eingefügt wird. Um ohne das Leerzeichen was zusammen fügen zu können nimmt man die Raute. Aber genau hier scheint es ein Problem zu geben ODER mit bzw. in Verbindung mit einem einfachen Macro (ohne Klammern).
Zusammengefaßt sehe ich das so:
Für Macroschlüsselwörter gibt es verschiedene Trennzeichen und EIN Verknüpfungszeichen. Die Trennzeichen sind mannigfaltig (Leerzeichen,+,$,%) und trennen bzw. zeigen das Einde eines Macros werden aber als Teil des Codes mit ausgegeben. Das einzige Verknüpfungszeichen Raute (#) wird NICHT mit ausgegeben.
Und hier liegt der Fehler. Kommt ein Verknüpfungszeichen NACH einem Macroaufruf (innerhalb eines Macros) vor, so wird es NICHT als Verknüpfungzeichen,sondern als Trennzeichen angesehen. Allerdings nur solange es nicht zwischen zwei Macroaufrufen steht.
Das verhalten ist für mich ohne PBcode natürlich nicht nachvollziehbar. Und ASM verstehe ich halt noch nicht (weil nicht gelernt).
Gruß
Toshy
[edit]
Ach ja, total vergessen. Meine "Feststellung und Vermutungen" beziehen sich zwar auf einen durch edel angemerkten "Fehler", aber nicht auf das "Case-Problem". Das habt ihr ja schon aufgeklärt.
Ich habe den Beitrag jetzt erst gesehen.
Also ich habe hier noch keine für mich zufrieden stellende Antwort gefunden.
DAs selbe was edel genannt hat, ist mir auch vor langem aufgefallen, muß schon einige Jahre her sein oder zumindest ein Jahr.
Alleine das
Code: Alles auswählen
Macro DoubleQuote
"
EndMacro
Macro DoubleUnderscore(Name)
DoubleQuote#_#Name#_#DoubleQuote
EndMacro
Debug DoubleUnderscore(bla) ;ergibt leider "#_bla_" Testet doch mal einzeln die beiden folgenden Macros
Code: Alles auswählen
Macro DoubleUnderscore2(Name)
DoubleQuote#_#Name#_#DoubleQuote
EndMacro
Macro DoubleUnderscore3(Name)
DoubleQuote#-#Name#-#DoubleQuote
EndMacro
;Debug DoubleUnderscore(bla) ;Muss "_bla_" ergeben, was auch funktioniert
Debug DoubleUnderscore2(bla)
Debug DoubleUnderscore3(bla) IRgendwann kam ich damals auf die Idee, wenn ne Raute drinn ist, die nicht reingehört lasse ich sie im Macro weg. Das ging schief
Code: Alles auswählen
Macro DoubleQuote
"
EndMacro
Macro DoubleUnderscore4(Name)
DoubleQuote_#Name#_#DoubleQuote
EndMacro
Debug DoubleUnderscore4(bla) Code: Alles auswählen
Macro DoubleQuote()
"
EndMacro
Macro DoubleUnderscore5(Name)
DoubleQuote()_#Name#_#DoubleQuote()
EndMacro
Debug DoubleUnderscore5(bla) Code: Alles auswählen
Macro DoubleQuote()
"
EndMacro
Macro DoubleUnderscore(Name)
DoubleQuote()_#Name#_#DoubleQuote()
EndMacro
Debug DoubleUnderscore(bla) ;Muss "_bla_" ergeben, was auch funktioniert
;Doch nun kommt das komische:
Procedure CallBug(Name$)
Select Name$
Case DoubleUnderscore(a)
;...
Case DoubleUnderscore(b)
;...
Case DoubleUnderscore(c)
;...
Case DoubleUnderscore(d)
;...
Case DoubleUnderscore(e)
;...
Case DoubleUnderscore(f)
Debug "geht doch"
;...
EndSelect
EndProcedure
CallBug("_f_") ;Müsste das letzte "Case" ansteuern
;Doch das einzige was passiert, ist ein "Invalid memory access"! Vergleich hierzu folgende drei Macros
Code: Alles auswählen
Macro DoubleUnderscore(Name)
DoubleQuote()_#Name#_#DoubleQuote()
EndMacroCode: Alles auswählen
Macro DoubleUnderscore(Name)
DoubleQuote()_#Name_#DoubleQuote()
EndMacroCode: Alles auswählen
Macro DoubleUnderscore(Name)
DoubleQuote()_#Name _#DoubleQuote()
EndMacroMir sind da noch ein zwei andere Beispiele aufgefallen die mich stutzig gemacht haben, aber alles wollte ich jetzt doch nicht noch mal austesten.
Ich gehe also noch immer und das seit längerm vom einem Bug aus, nicht von etwas nicht unterstützt wird.
Wenn man die Hilfedatei wörtlich nimmt, müßte eigentlich der "Inhalt" jedes Schlüsselwort was im Macroaufruf steht (in der Klammer) innerhalb des Macros überall den Teil ersetzten der dem Schlüsselwort genau entspricht, sei er auch es auch nur ein Teil.
Code: Alles auswählen
Macro a(test)
"dastestenwirmal"
EndMacro
Debug a(nene)Zusammengefaßt sehe ich das so:
Für Macroschlüsselwörter gibt es verschiedene Trennzeichen und EIN Verknüpfungszeichen. Die Trennzeichen sind mannigfaltig (Leerzeichen,+,$,%) und trennen bzw. zeigen das Einde eines Macros werden aber als Teil des Codes mit ausgegeben. Das einzige Verknüpfungszeichen Raute (#) wird NICHT mit ausgegeben.
Und hier liegt der Fehler. Kommt ein Verknüpfungszeichen NACH einem Macroaufruf (innerhalb eines Macros) vor, so wird es NICHT als Verknüpfungzeichen,sondern als Trennzeichen angesehen. Allerdings nur solange es nicht zwischen zwei Macroaufrufen steht.
Das verhalten ist für mich ohne PBcode natürlich nicht nachvollziehbar. Und ASM verstehe ich halt noch nicht (weil nicht gelernt).
Gruß
Toshy
[edit]
Ach ja, total vergessen. Meine "Feststellung und Vermutungen" beziehen sich zwar auf einen durch edel angemerkten "Fehler", aber nicht auf das "Case-Problem". Das habt ihr ja schon aufgeklärt.
1. Win10
PB6.1
PB6.1