Seite 4 von 4

Verfasst: 14.03.2009 23:16
von cxAlex
Aber PB optimiert

"_"+"a"+"_" vor dem Compilieren zu "_a_", also

"_"+"a"+"_" = "_a_"

Ansonst könnte man die Optimierung vergessen.

Verfasst: 14.03.2009 23:16
von edel
Der String wird vom Compiler zusammen gesetzt und im Quellcode gespeichert. Es ist also nur ein "_a_"

Verfasst: 14.03.2009 23:25
von PMV
:roll:
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_")
MFG PMV

Verfasst: 14.03.2009 23:35
von ts-soft
Also wird string arithmetik in macros nicht unterstützt. Mit diesem Wissen
kann man doch leben :wink:

Verfasst: 14.03.2009 23:36
von PMV
Nein ... in select case. /:->

Verfasst: 14.03.2009 23:42
von ts-soft
PMV hat geschrieben:Nein ... in select case. /:->
auch recht :wink:

Verfasst: 14.03.2009 23:42
von Kaeru Gaman
ts-soft hat geschrieben:Also wird string arithmetik in macros nicht unterstützt.
PMV hat geschrieben:Nein ... in select case.
:lol:

@PMV

gute Herleitung! :allright:

Verfasst: 04.05.2009 05:29
von Toshy
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.