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?
Mit Macro überladen ?
Mit Macro überladen ?
Zuletzt geändert von Tommy am 27.01.2015 12:25, insgesamt 2-mal geändert.
PB 5.41 x64
Re: Mit Macro überladen ?
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 ?
Sehr eingeschränkt kann man Prozeduren so aufrufen:
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:
Rückgabewerte müsste man also auch über ein Funktionsargument (Pointer) zurück geben.
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)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)cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
- NicTheQuick
- Ein Admin
- Beiträge: 8837
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Mit Macro überladen ?
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
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

