Seite 1 von 2
Makros: Falsche Anwendung oder Bug?
Verfasst: 04.01.2009 20:58
von Josef Sniatecki
Folgendes habe ich gefunden, was laut Beschreibung in der Hilfe nicht
mit Makros passieren sollte:
(Ist nur ein Beispiel):
Code: Alles auswählen
Macro Call(FunctionAndArguments)
Function_#FunctionAndArguments
EndMacro
Procedure.i Function_Test1(a,b)
Debug a
Debug b
EndProcedure
Procedure.i Function_Test2(a,b)
Debug a+10
Debug b+10
EndProcedure
Call(Test1(1,2))
Nun müsste die letzte Zeile zu "Function_Test(1,2)" werden, doch
stattdessen wird daraus der Fehler "Function_#Test(1,2)".
Doch das komische ist, dass das Beispiel ohne "_" vor dem "#","Test1"
und "Test2" funktioniert.
Der Bug ist also: Wenn das Symbol "#" nach einem Unterstrich steht,
dann wird das "#" nicht entfernt.
Könnt ihr das bestätigen? Wurde das schon mal gemeldet, oder im
Englischem Forum angedeutet?
Gruß Josef
Verfasst: 04.01.2009 21:03
von cxAlex
Bei mir läuft dein Code einwandfrei:
Code: Alles auswählen
Macro Call(FunctionAndArguments)
Function_#FunctionAndArguments
EndMacro
Procedure.i Function_Test1(a,b)
Debug a
Debug b
EndProcedure
Procedure.i Function_Test2(a,b)
Debug a+10
Debug b+10
EndProcedure
Call(Test1(1,2))
PB 4.3 x86
Verfasst: 04.01.2009 21:07
von Josef Sniatecki
Hab auch jetzt gemerkt, dass es an etwas anderem lag. Wenn der Makro
genauso heißt, wie das vor dem "#", dann kommt es zu einem Fehler:
Code: Alles auswählen
Macro Example_(FunctionAndArguments)
Example_#FunctionAndArguments
EndMacro
Procedure.i Example_Test1(a,b)
Debug a
Debug b
EndProcedure
Procedure.i Example_Test2(a,b)
Debug a+10
Debug b+10
EndProcedure
Example_(Test1(1,2))
Kann man das dann immer noch als Bug anerkennen, oder ist das ein
Rekursions-Fehler? Denn da bin ich mir nicht sicher, da ich im Makro
"Example_" keine Klammer angebe, sondern nur einen angehängten
Makro-Parameter.
Verfasst: 04.01.2009 21:13
von Kaeru Gaman
ob das eine Rekursion auslöst weiß ich nicht, weil PB ja keine beliegig vielen compiler durchgänge ausführt.
aber ein Fehler deinerseits ist es auf jeden Fall.
Verfasst: 04.01.2009 21:16
von cxAlex
Kann ich bestätigen. Wenn der Makro-Name vor dem # - Verknüpfungsoperator vorkommt, gibt es einen Fehler.
Würde sagen es ist ein Bug, den in der Hilfe steht nicht das der Macro-Name nicht im Macro vorkommen darf:
http://www.purearea.net/pb/german/manua ... acros.html
Edit:
> aber ein Fehler deinerseits ist es auf jeden Fall.
Wiso? Man kan darüber streiten ob die Namensgebung sinnvoll ist, aber laut Hilfe hat er keinen Fehler gemacht.
[offtopic]
> ob das eine Rekursion auslöst weiß ich nicht, weil PB ja
keine beliegig vielen compiler durchgänge ausführt.
Ich hab ja schon oft im englischen Forum sowas gelesen das PB ein Single-Pass-Compiler währe. Aber was hat das für einen Sinn? Der Asm - Output würde sich IMHO mit einem Multipass Compiler weit mehr optimieren lassen?
[/offtopic]
Verfasst: 04.01.2009 21:20
von Kaeru Gaman
naja..
also für mich wäre die wiederverwendbarkeit von namen eher etwas, was explizit erwähnt werden müßte.
> in der Hilfe steht nicht das der Macro-Name nicht im Macro vorkommen darf
in der Help muss auch nicht jeder selbstverständlicher schei$ drinstehen.
> laut Hilfe hat er keinen Fehler gemacht.
nur weil nicht drin steht, dass er es nicht darf, heißt es nicht dass er es nicht darf, siehe oben.
identische namen parallel für variablen und funktionen verwenden zu können, fände ich extrem strange.
ein array darf nicht so heißen wie eine funktion, weil der compiler diese nicht unterscheiden könnte.
wieso sollte es überhaupt möglich sein, dass ein Objekt vom Typ1 exakt den selben bezeichner trägt wie ein Objekt vom Typ2?
das entbehrt jeder logik.
Verfasst: 04.01.2009 21:25
von cxAlex
Gut, hast recht. Trozdem ist der Fehler komisch das einfach das # - nicht entfernt wird. Eine "forbidden" - Fehlermeldung oder sowas währe sinnvoller.
Verfasst: 04.01.2009 21:36
von Kaeru Gaman
yup, da stimme ich dir zu. ne saubere Fehlermeldung wäre schön.
wobei die Frage bleibt, warum man unbedingt zwei zusätzliche klammern schreiben will...
es ist schließlich nicht möglich, den Inhalt einer stringvariable an ein Macro zu übergeben...
Verfasst: 04.01.2009 21:41
von Josef Sniatecki
Immerhin waren die Codes da oben nur unbedeutsame Beispiele. Hier
mal ein Code, der sich wirklich lohnt:
Code: Alles auswählen
Macro Error_(FunctionAndArguments)
Error_#FunctionAndArguments
ProcedureReturn
EndMacro
Procedure.i Error_Std(Message.s)
Debug Message
EndProcedure
Procedure.i Error_Arg(Type.s)
Debug "Invalid Type used: "+Type
EndProcedure
Procedure.i Test(Type.s)
If Type<>"Integer"
Error_(Arg(Type))
;Anbei wird noch automatisch ein
;"ProcedureReturn" hinzugefügt.
EndIf
Debug "This Type is valid: "+Type
EndProcedure
Test("Integer") ;Ausgabe: This Type is valid: Integer
Test("String") ;Ausgabe: Invalid Type used: String
Verfasst: 04.01.2009 21:47
von Kaeru Gaman
nö, seh ich nicht.
wenn du
schreiben kannst, warum schreibst du nicht gleich
