Seite 2 von 4

Verfasst: 14.03.2009 15:11
von Kaeru Gaman
hm... ich muss mich wohl bei dir entschuldigen, da hat mich ts gestern wohl aufs Glatteis geführt.

ich kann nur vermuten, dass es sich dabei um einen konflikt in der verarbeitungsreihenfolge handelt.

da PB ausdrücklich ein one-pass-compiler ist, ergeben sich manchmal probleme daraus,
in welcher reihenfolge die umwandlungsschritte pro kommando ausgeführt werden.

möglicher weise wird hier nicht zuerst das Macro ersetzt und dann der literale string allociert,
deswegen steht "_a_" nicht literal im speicher, wie der test es benötigt.

das müßte dann aber auch bei IF auftreten, nicht nur bei CASE.

grundsätzlich aber schon ein Konflikt, der zumindest hinterfragt werden muss.
es wäre zumindest in die Help aufzunehmen, wenn man Macros nicht in Cases verwenden kann.

PS:
oh, edel hat inzwischen den ASM-Output gecheckt...
da bin ich etwas eingerostet... sagt mir nicht so viel.
aber wenn edel sagt, dass da eine diskrepanz besteht,
wird das wohl zutreffen.

Verfasst: 14.03.2009 15:18
von - chris -

Code: Alles auswählen

Macro DoubleQuote
  "
EndMacro
Macro DoubleUnderscore(Name)
  "_"+DoubleQuote#Name#DoubleQuote+"_"
EndMacro

Procedure CallBug(Name$)

  Debug DoubleUnderscore(f)

  a$ = DoubleUnderscore(a)
  b$ = DoubleUnderscore(b)
  c$ = DoubleUnderscore(c)
  d$ = DoubleUnderscore(d)
  e$ = DoubleUnderscore(e)
  f$ = DoubleUnderscore(f)
    
  Select Name$
    Case a$
      ;...
    Case b$
      ;...
    Case c$
      ;...
    Case d$
      ;...
    Case e$
      ;...
    Case f$
      Debug "OK"
      ;...
  EndSelect
EndProcedure


CallBug("_f_") 

Wenn ich das so mache funktioniert das ganze.


Bei Debug DoubleUnderscore(f) fehlen die Anführungsstriche.

_f_

"_f_" so sollte es aussehen.

Verfasst: 14.03.2009 15:24
von Josef Sniatecki
Klar, ist natürlich ein Umweg. Jedoch nicht sehr professionell. Die Variablen
werden immer wieder neu allociert und werden nach jedem aufruf
gesetzt. Dass nimmt einiges an speed.

PS: Gut das sich dieses Thema erledigt hat. Nun muss jemand Englisch
können, oder?

Verfasst: 14.03.2009 15:28
von Kaeru Gaman
> Bei Debug DoubleUnderscore(f) fehlen die Anführungsstriche.

nein.
die DQs stehen im code, aber wenn du das an Debug übergibst, werden die natürlich weggelassen.
Debug "bla"
wird auch ohne DQs ausgegeben...

dass dein Beispiel funktioniert wundert mich jetzt nicht,
weil hier die statischen strings korrekt angelegt werden, jeder für sich.

[edit]

> Die Variablen werden immer wieder neu allociert und werden nach jedem aufruf
> gesetzt. Dass nimmt einiges an speed.

mach mal nen speedvergleich, wenn du die strings STATIC deklarierst...

aber klar, ist nur ein fishy workaround.

ob sich das zeitnah und aufwandsökonomisch beheben läßt,
oder ob man sagen muss "bis PB 5.0 haben Macros in Cases nix verloren"
wird sich zeigen müssen...


[edit2]

kann man eigentlich Konstantenwerte per Macros erzeugen lassen, oder werden die noch vorher ersetzt?
wenn das ginge, dann wäre das vielleicht ein brauchbares wörkeraund..?

Verfasst: 14.03.2009 15:56
von - chris -
So jetzt ohne Variablen:

Code: Alles auswählen


Macro DoubleQuote
  "
EndMacro
Macro UnderLine
  _
EndMacro
Macro DoubleUnderscore(Name)
  Case DoubleQuote#UnderLine#Name#UnderLine#DoubleQuote
EndMacro

Procedure CallBug(Name$)
   
 Select Name$
   DoubleUnderscore(a)
     Debug "OK - a"
       ;...
   DoubleUnderscore(b)
       ;...
   DoubleUnderscore(c)
       ;...
   DoubleUnderscore(d)
       ;...
   DoubleUnderscore(e)
       ;...
   DoubleUnderscore(f)
     Debug "OK - f"
       ;...
  EndSelect
EndProcedure

CallBug("_a_") 

CallBug("_f_") 

[/code]

Verfasst: 14.03.2009 15:57
von Kaeru Gaman
:lol: DAS nenne ich mal pfiffig! :allright:

Verfasst: 14.03.2009 16:42
von Josef Sniatecki
Gute Idee :allright:

Verfasst: 14.03.2009 17:35
von edel
Kaeru Gaman hat geschrieben: dass dein Beispiel funktioniert wundert mich jetzt nicht,
weil hier die statischen strings korrekt angelegt werden, jeder für sich.
Doch doch, die Strings werden richtig angelegt, nur niemals benutzt.

Verfasst: 14.03.2009 17:53
von Kaeru Gaman
edel hat geschrieben:
Kaeru Gaman hat geschrieben: dass dein Beispiel funktioniert wundert mich jetzt nicht,
weil hier die statischen strings korrekt angelegt werden, jeder für sich.
Doch doch, die Strings werden richtig angelegt, nur niemals benutzt.
du meinst in dem Beispiel, was den IMA erzeugt...
also wird da "nur" der Pointer verbummelt?

... hab jetzt deinen Kommentar noch mal gelesen... hatte ich wohl mißverstanden.

also, die statischen strings werden angelegt, aber PB "vergißt" wo sie sind und greift wild auf den Pool zu...?
lieg ich jetzt richtig?

Verfasst: 14.03.2009 18:11
von Little John
Kaeru Gaman hat geschrieben:da hat mich ts gestern wohl aufs Glatteis geführt.
Ich habe mich von dem Beispiel offenbar auch irreführen lassen. Du hast Recht, Josef. Sorry.

Gruß, Little John