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
Code: Alles auswählen
Macro DoubleQuote
"
EndMacro
Macro DoubleUnderscore(Name)
DoubleQuote#_#Name#_#DoubleQuote
EndMacro
Debug DoubleUnderscore(bla) ;ergibt leider "#_bla_"
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
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)
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
Code: Alles auswählen
Macro DoubleQuote
"
EndMacro
Macro DoubleUnderscore4(Name)
DoubleQuote_#Name#_#DoubleQuote
EndMacro
Debug DoubleUnderscore4(bla)
Was aber bei mir seit dem immer wunderbar funktioniert ist
Code: Alles auswählen
Macro DoubleQuote()
"
EndMacro
Macro DoubleUnderscore5(Name)
DoubleQuote()_#Name#_#DoubleQuote()
EndMacro
Debug DoubleUnderscore5(bla)
selbst das hier geht verwunderlicher weise (oder auch nicht wunderlich)
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"!
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
Code: Alles auswählen
Macro DoubleUnderscore(Name)
DoubleQuote()_#Name#_#DoubleQuote()
EndMacro
Code: Alles auswählen
Macro DoubleUnderscore(Name)
DoubleQuote()_#Name_#DoubleQuote()
EndMacro
Code: Alles auswählen
Macro DoubleUnderscore(Name)
DoubleQuote()_#Name _#DoubleQuote()
EndMacro
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.
Code: Alles auswählen
Macro a(test)
"dastestenwirmal"
EndMacro
Debug a(nene)
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.