Seite 3 von 4
Verfasst: 14.03.2009 18:17
von edel
Ich denke eher das PB der Meinung ist, das es sich bei dem Macro um
eine Funktion handelt, den Code dafuer einbaut, aber den Aufruf zu dieser
"Funktion" nicht mehr hinein schreibt.
Code: Alles auswählen
Macro DoubleQuote
"
EndMacro
Macro DoubleUnderscore(Name)
"_"+DoubleQuote#Name#DoubleQuote+"_"
EndMacro
Procedure.s a()
ProcedureReturn "huhu"
EndProcedure
Select Name$
Case a()
Case DoubleUnderscore(Name)
EndSelect
Der Compiler baut sich folgendes daraus zusammen :
Code: Alles auswählen
; Select Name$
PUSH dword [v_Name$]
; Case a()
PUSH dword [_PB_StringBasePosition]
CALL _Procedure0
POP edx
MOV dword [_PB_StringBasePosition],edx
ADD edx,[PB_StringBase]
MOV ecx,[esp]
CALL _SYS_StringEqual
JE _Case1
; Case DoubleUnderscore(Name)
JMP _EndSelect1
_Case1:
POP edx
MOV dword [_PB_StringBasePosition],edx
ADD edx,[PB_StringBase]
MOV ecx,[esp]
CALL _SYS_StringEqual
JE _Case2
; EndSelect
Im ersten Block sieht man wie die Funktion aufgerufen wird.
Der 2. Block sieht eigentlich genauso aus, nur das es da keine
Funktion zum aufrufen gibt. Hier haette jetzt der Zugriff zu dem
statischen String erfolgen muessen.
Mit dem Case Workaround sieht das dann so aus :
Code: Alles auswählen
MOV edx,_S1
MOV ecx,[esp]
CALL _SYS_StringEqual
JE _Case1
Also genau der gleiche Code, als wenn man "_a_" schreiben wuerde.
Verfasst: 14.03.2009 19:40
von ts-soft
Ich weiß nicht ob ihr recht habt, aber wenn, dann dürfte der erste Teil auch
nicht richtig funktionieren:
Code: Alles auswählen
Macro DoubleQuote
"
EndMacro
Macro DoubleUnderscore(Name)
"_"+DoubleQuote#Name#DoubleQuote+"_"
EndMacro
Debug DoubleUnderscore(bla) ;Muss "_bla_" ergeben, was auch funktioniert
Müßte logischerweise "_0_" ergeben

oder "__"
Verfasst: 14.03.2009 19:43
von Kaeru Gaman
nein wieso...
da hast du doch kein "Case", was ja anscheinend mit dem Auslösen des Fehlverhaltens irgendwie zusammenhängt.
Verfasst: 14.03.2009 19:59
von ts-soft
Kaeru Gaman hat geschrieben:nein wieso...
da hast du doch kein "Case", was ja anscheinend mit dem Auslösen des Fehlverhaltens irgendwie zusammenhängt.
In dem Beispiel ist bla eine variable vom Wert 0, er macht aber "_bla_"
draus. Wenn das korrekt wäre, warum soll er bei Name$ nicht "_Name$_"
machen. Beides kann nicht richtig sein
//edit
Ich laß es lieber sein mit Macros, die sind so unlogisch

Verfasst: 14.03.2009 20:11
von Kaeru Gaman
> Wenn das korrekt wäre, warum soll er bei Name$ nicht "_Name$_"
machen.
weil es darum ja garnicht geht...
erstes posting:
Code: Alles auswählen
Procedure CallBug(Name$)
Select Name$
Case DoubleUnderscore(a)
;...
Case DoubleUnderscore(b)
;...
Case DoubleUnderscore(c)
;...
Case DoubleUnderscore(d)
;...
Case DoubleUnderscore(e)
;...
Case DoubleUnderscore(f)
;...
EndSelect
EndProcedure
nicht "name$" wird an das Macro übergeben, sondern die buchstaben a-f
da hast du dich von Anfang an verguckt gehabt...
außerdem funktioniert das Macro ja mit If oder wenn man das Case ins Macro mit hineinnimmt.
Verfasst: 14.03.2009 20:24
von edel
ts-soft hat geschrieben:Kaeru Gaman hat geschrieben:nein wieso...
da hast du doch kein "Case", was ja anscheinend mit dem Auslösen des Fehlverhaltens irgendwie zusammenhängt.
In dem Beispiel ist bla eine variable vom Wert 0, er macht aber "_bla_"
draus. Wenn das korrekt wäre, warum soll er bei Name$ nicht "_Name$_"
machen. Beides kann nicht richtig sein
//edit
Ich laß es lieber sein mit Macros, die sind so unlogisch

Unter normalen Umstaenden macht das Macro genau das was es soll,
wenn du Name$ uebergibst, kommt "_Name$_" dabei raus. Und nicht
der Inhalt von Name$.
Verfasst: 14.03.2009 22:52
von PMV
Mal so neben bei ... das Macro funktioniert prima. Und was ihr hier als
"Bug" angebt ist einfach nicht unterstützt. Vor einigen Monaten gabs doch
mal einen Thread über Funktionen, die einen String zurückgaben in Select
Case. Ergebnis nach längerer Diskussion. Nicht unterstützt. Hier ist es
sicher auch so, denn ihr versucht hier keinen einzellnen String zu
überprüfen sondern einen Zusammengesetzten. Das Macro ergibt
"_"+"a"+"_" und nicht "_a_" ... versucht das ganze mal ohne Macro
fürt zu einem IMA.
Was blöd ist ... das folgendes Macro auch nicht funktioniert:
Code: Alles auswählen
Macro DoubleQuote
"
EndMacro
Macro DoubleUnderscore(Name)
DoubleQuote#_#Name#_#DoubleQuote
EndMacro
Debug DoubleUnderscore(bla) ;ergibt leider "#_bla_"
Was da jetzt genau alles ein Bug ist oder einfach nicht vorgesehen ist
muss wohl erst mal freak beantworten.
MFG PMV
Verfasst: 14.03.2009 23:06
von Kaeru Gaman
der "zusammengesetzte string" den du da vorstellst, wird aber zur Laufzeit zusammengesetzt.
und wenn das "Case" im Macro selbst enthalten ist, funktioniert es ja.
das ist also eine ganz andere Problematik, als das zusammensetzen zur Laufzeit.
Verfasst: 14.03.2009 23:10
von edel
Das Macro ergibt "_a_" und nicht "_"+"a"+"_".
Verfasst: 14.03.2009 23:14
von PMV
Da kann wohl jemand nicht zählen.
Code: Alles auswählen
Macro DoubleQuote
"
EndMacro
Macro DoubleUnderscore(Name)
"_"+DoubleQuote#Name#DoubleQuote+"_"
EndMacro
... Das besteht aus:
"_"
+
DoubleQuote#Name#DoubleQuiote
+
"_"
Dann wird das innere Macro aufgelöst
"_"
+
"Name"
+
"_"
... tada
Und probiert doch erst Code aus bevor ihr etwas behauptet:
Code: Alles auswählen
Procedure CallBug(Name$)
Select Name$
Case "_"+"a"+"_"
;...
Case "_b_"
;...
Case "_c_"
;...
Case "_d_"
;...
Case "_e_"
;...
Case "_f_"
;...
EndSelect
EndProcedure
CallBug("_f_") ;Müsste das letzte "Case" ansteuern
;Doch das einzige was passiert, ist ein "Invalid memory access"!
MFG PMV