Seite 1 von 1

Mit Macro überladen ?

Verfasst: 21.01.2015 13:09
von Tommy
Ich weiss dass PB keine Überladung kann und bin langsam auf den Geschmack gekommen
"oop" zu denken.
Mit Macros kann man Funktionen ersetzen. Ich habe im Code Tips und Tricks Forum einen Code geschrieben
um Gadgets einmalig zu erstellen mit gleichzeitigen Resize Möglichkeit. Klapt ganz gut muss den Code noch
vervollständigen / zu ende bringen aber ich bin noch dabei und hab es nich vergessen.
Nun, mit Macros kann man Funktionen ersetzen aber auch überladen? Wenn ich zwei Prozeduren habe
mit dem gleichen Namen aber mit unterschiedlichen Parameter soll immer die Prozedur genommen werden
die ich mit meinen Parameter angegeben habe aber ich finde leider keine Lösung um Überladung zu simulieren.
Ich ken mich auch nicht so super aus mit Macros. Habt mehr Hintergrundwissen und eine Lösung? Egal was ich mache
Purebasic meckert immer dass mehrere Prozeduren gibt aber ich kann es nicht mit Macros bewerkstelligen
dass es auch mit beiden geht. Könnt ihr mir weiterhelfen?

Re: Mit Macro überladen ?

Verfasst: 21.01.2015 13:17
von RSBasic
Das ist nicht möglich, aber du kannst ein eigenes Werkzeug entwickeln, welches vor dem Kompilieren ausgeführt wird und deinen Code durchsucht und die Namen und Verweise der einzelnen Prozeduren anpasst.

Re: Mit Macro überladen ?

Verfasst: 21.01.2015 14:01
von Danilo
Sehr eingeschränkt kann man Prozeduren so aufrufen:

Code: Alles auswählen

Procedure PrintItS(var.s) : Debug "String: " +var : EndProcedure
Procedure PrintItF(var.f) : Debug "Float: "  +var : EndProcedure
Procedure PrintItI(var.i) : Debug "Integer: "+var : EndProcedure

Macro PrintIt(_x_)
    CompilerIf TypeOf(_x_) = #PB_String
        PrintItS(_x_)
    CompilerElseIf TypeOf(_x_) = #PB_Float
        printItF(_x_)
    CompilerElseIf TypeOf(_x_) = #PB_Integer
        PrintItI(_x_)
    ;...
    CompilerEndIf
EndMacro

var1.s = "Hallo"
var2.f = 2.5
var3.i = 7

PrintIt(var1)
PrintIt(var2)
PrintIt(var3)
Aber schon ein PrintIt("Hallo") funktioniert nicht mehr, da TypeOf() leider nur mit Variablen funktioniert.

Wenn die Procedure dann auch noch etwas zurück geben soll, dann macht das CompilerIf Probleme:

Code: Alles auswählen

Procedure.d MaxD(var1.d,var2.d) : If var1>var2 : ProcedureReturn var1 : EndIf : ProcedureReturn var2 : EndProcedure
Procedure.f MaxF(var1.f,var2.f) : If var1>var2 : ProcedureReturn var1 : EndIf : ProcedureReturn var2 : EndProcedure
Procedure.i MaxI(var1.i,var2.i) : If var1>var2 : ProcedureReturn var1 : EndIf : ProcedureReturn var2 : EndProcedure

Macro Max( _x_ , _y_ )
    CompilerIf     TypeOf(_x_) = #PB_Double  Or TypeOf(_y_) = #PB_Double
        MaxD(_x_,_y_)
    CompilerElseIf TypeOf(_x_) = #PB_Float   Or TypeOf(_y_) = #PB_Float
        MaxF(_x_,_y_)
    CompilerElseIf TypeOf(_x_) = #PB_Integer Or TypeOf(_y_) = #PB_Integer
        MaxI(_x_,_y_)
    ;...
    CompilerEndIf
EndMacro

var4.d = 1.0001 : var5.d = 1.0002
var6.f = 2.5    : var7.f = 2.52
var8.i = 7      : var9.i = 10

Debug Max(var4, var5)
Debug Max(var6, var7)
Debug Max(var8, var9)
Rückgabewerte müsste man also auch über ein Funktionsargument (Pointer) zurück geben.

Re: Mit Macro überladen ?

Verfasst: 21.01.2015 14:03
von NicTheQuick
Ich hatte irgendwo auch mal sowas gemacht, aber ich müsste es erst mal wieder finden. Moment...

Hier ist jedenfalls schon mal ein vergleichbarer Thread: Kann man Prozeduren in PB überladen?
Und hier hab ich mal sowas gemacht: Feature Requests and Wishlists -> [PB 5.10b5] CompilerIf TypeOf("asdf") = #PB_String and more