Mal wieder die Makros
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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.
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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
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_")
Bei Debug DoubleUnderscore(f) fehlen die Anführungsstriche.
_f_
"_f_" so sollte es aussehen.
Code: Alles auswählen
- Josef Sniatecki
- Beiträge: 657
- Registriert: 02.06.2008 21:29
- Kontaktdaten:
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?
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?
PB 4.61 | Windows Vista - 32Bit
Homepage
"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Homepage
"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> 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..?
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..?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
So jetzt ohne Variablen:
[/code]
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_")
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
- Josef Sniatecki
- Beiträge: 657
- Registriert: 02.06.2008 21:29
- Kontaktdaten:
Gute Idee 
PB 4.61 | Windows Vista - 32Bit
Homepage
"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Homepage
"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
du meinst in dem Beispiel, was den IMA erzeugt...edel hat geschrieben:Doch doch, die Strings werden richtig angelegt, nur niemals benutzt.Kaeru Gaman hat geschrieben: dass dein Beispiel funktioniert wundert mich jetzt nicht,
weil hier die statischen strings korrekt angelegt werden, jeder für sich.
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?
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