Mit Macro überladen ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

Mit Macro überladen ?

Beitrag 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?
Zuletzt geändert von Tommy am 27.01.2015 12:25, insgesamt 2-mal geändert.
PB 5.41 x64
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Mit Macro überladen ?

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Mit Macro überladen ?

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
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 ?

Beitrag 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
Antworten