Kann man Prozeduren in PB überladen?

Anfängerfragen zum Programmieren mit PureBasic.
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

Kann man Prozeduren in PB überladen?

Beitrag von GronkhLP »

Tach, ich fand im Internet diese Nischensprache und sieht auf den ersten Blick ganz nett aus. Noch habe ich die Demo, aber ich glaube, ich werde es kaufen.
Die Frage, die ich mir stelle ist, ob in PB wie zum Beispiel in CSarp auch Überladen von Funktionen/Methoden/Prozeduren geht? Ich habe in der von PB bereitgestellten Hilfe nichts über dieses Feature gefunden.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Kann man Prozeduren in PB überladen?

Beitrag von RSBasic »

Überladen ist leider nicht möglich.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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: Kann man Prozeduren in PB überladen?

Beitrag von NicTheQuick »

Man kann aber immerhin Parameter definieren.

Code: Alles auswählen

Procedure.i add(value1.i, value2.i, carry.i = 0)
	ProcedureReturn value1 + value2 + carry
EndProcedure

Debug add(1, 2, 3)
Debug add(4, 5)
Debug add(4, 5, 0)
Wenn man Überladen will, dann kann man das höchstens durch ein paar Macro-Tricks hinbekommen durch einfache Typunterscheidungen. Aber das ist nichts halbes und nichts ganzes.

PS.: Ich kenn dich doch. :D Du bist doch einer von denen, die immer die ganzen Let's Plays auf Youtube machen. Wie hast du dich zu PureBasic verirrt?
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Kann man Prozeduren in PB überladen?

Beitrag von PMV »

Überladen ist eingentlich schon möglich ...

Man kann Interfaces (siehe PB Hilfe) oder inzwischen
auch Prototypen (PB Hilfe) dazu nutzen. <)
Man sollte nur wissen, was Zeiger sind und wie das
ganze funktioniert. Nach dem man sich aber
damit vertraut gemacht hat, ist es kein Hexenwerk
mehr. Wenn du Glück hast gibt dir hier vielleicht
sogar jemand ein Beispiel. <)

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Kann man Prozeduren in PB überladen?

Beitrag von c4s »

Offtopic:
NicTheQuick hat geschrieben:PS.: Ich kenn dich doch. :D Du bist doch einer von denen, die immer die ganzen Let's Plays auf Youtube machen.
Wenn sich demnächst "Angela Merkel" mit passendem Bildchen registriert, glaubst du auch, dass es sie ist?! :o
Trotzdem kannst du natürlich mit deiner Vermutung recht haben. Man darf dennoch nie vergessen wie einfach es doch (im Internet) ist, so zu tun als wäre man Person X, Y oder Z.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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: Kann man Prozeduren in PB überladen?

Beitrag von NicTheQuick »

c4s hat geschrieben:Offtopic:
NicTheQuick hat geschrieben:PS.: Ich kenn dich doch. :D Du bist doch einer von denen, die immer die ganzen Let's Plays auf Youtube machen.
Wenn sich demnächst "Angela Merkel" mit passendem Bildchen registriert, glaubst du auch, dass es sie ist?! :o
Trotzdem kannst du natürlich mit deiner Vermutung recht haben. Man darf dennoch nie vergessen wie einfach es doch (im Internet) ist, so zu tun als wäre man Person X, Y oder Z.
Natürlich war es eine Vermutung. Lediglich seine E-Mail-Adresse und IP klingt nicht ganz plausibel, aber die E-Mail könnte eine private sein und die IP muss ja nicht zwangsweise aus Köln kommen, nur weil er laut des Impressums auf der Webseite von dort kommt.
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

Re: Kann man Prozeduren in PB überladen?

Beitrag von GronkhLP »

Sorry für meine späte Antwort. Ich habe immer nur etwas Zeitpuffer wohl eher abends. Daher nicht wundern wenn ich erst ein oder mehrere Tage später antworte.
Danke für eure hilfreichen Antworten. Wie könnte eine Macro-Lösung aussehen, wenn man eine "Funktions"überladung simulieren möchte? Für eine Beispielvariante mit Interface würde ich mich ebenfalls interessieren, wenn es euch keine Umstände macht.
Wenn es am Ende krude ist, dann ist nicht so schlimm. Ich kann auch darauf verzichten, es wäre nur praktischer.
@c4s
Da muss ich dir zustimmen. Ich weiß zwar nicht warum, aber viele erstellen Fakeaccounts um die Bekanntheit einer Person auszunutzen, aber mir ist das inzwischen egal. Verhindern kann man es eh nicht. Ich sehe oft in Spielen, dass mein Name - auch Namen von anderen Youtubern - oft verwendet wird. Wie ich schon mehrfach in Lets Plays gesagt habe, muss ich oft feststellen, dass wenn ich mich irgendwo registriere, mein Name schon benutzt|registriert wurde. :-D
@NicTheQuick
Vor meiner Lets Play-Zeit habe ich oft programmiert und will wieder was umsetzen, aber diesmal mal eine andere Sprache. In einem anderen Forum wurde PureBasic mehrfach erwähnt und es gibt Dinge, die muss man einfach mal ausprobiert habe. :-D
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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: Kann man Prozeduren in PB überladen?

Beitrag von NicTheQuick »

Wie stellst du dir das mit der Überladung genau vor? Geht's einfach darum mehrere Procedures mit gleichem Namen zu schreiben, die je nach Parametertyp aufgerufen werden? Oder soll sogar die Parameteranzahl variabel sein?

Ich nehme an du meinst sowas in der Art:

Code: Alles auswählen

Procedure.i Add(a.i, b.i)
	ProcedureReturn a + b
EndProcedure

Procedure.s Add(a.s, b.s)
	ProcedureReturn a + b
EndProcedure

Debug Add(1, 2)
Debug Add("1", "2")
Oder irre ich mich da?

Nachtrag:
Das Problem ist, dass man aus Macros und CompilerIfs zwar etwas basteln kann, was Typen unterscheidet, aber das funktioniert nur mit Variablen und nicht mit konstanten Ausdrücken. Außerdem kann man keine Rückgabewerte mehr zurück geben.

Code: Alles auswählen

Procedure.i Add_i(a.i, b.i)
	ProcedureReturn a + b
EndProcedure

Procedure.s Add_s(a.s, b.s)
	ProcedureReturn a + b
EndProcedure

Macro Add(r, a, b)
	CompilerIf TypeOf(a) = #PB_String And TypeOf(b) = #PB_String
		r = Add_s(a, b)
	CompilerElseIf TypeOf(a) = #PB_Integer And TypeOf(b) = #PB_Integer
		r = Add_i(a, b)
	CompilerEndIf
EndMacro

Define a1.i = 1, b1.i = 2, c1.i

Add(c1, a1, b1)
Debug c1

Define a2.s = "1", b2.s = "2", c2.s

Add(c2, a2, b2)
Debug c2
Wenn man jetzt z.B. 'Add(c1, 1, 2)' schreibt, dann gibt es einen Fehler, weil er den Typ von 1 nicht bestimmen kann, obwohl es logisch ist, was gemeint ist. Das selbe gilt für die Version mit "1" statt a2.

Ich hoffe da tut sich noch etwas bei Purebasic. Ansonsten könnte man sich aber vielleicht selbst eine Art Precompiler basteln, der das für einen übernimmt.
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

Re: Kann man Prozeduren in PB überladen?

Beitrag von GronkhLP »

Ja in dieser Art (erster Code) stelle ich mir das vor. Es kann auch so lauten:

Code: Alles auswählen

Procedure compareValues(dataArray, pEntry, sEntry)
EndProcedure
Procedure compareValues(pString.s, sString.s)
EndProcedure
Und je nach dem welche Proc ich nehme, wird anhand der Params zugeordnet. Das geschiet über eine Unterscheidung von Datentypen sowie Anzahl der Params.

Dein zweiter Code sieht interessant aus, aber ich denke, das wäre nichts für einen sauberen Code. Danke, dass du so hilfsbereit warst, mir mit Beispielen zu helfen. :-)
Bild
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Kann man Prozeduren in PB überladen?

Beitrag von PMV »

Ich halte zwar nichts davon, Prozeduren mit beliebigen Parametertypen
auf zu rufen, da man in 99,99% weis, was man für eine Prozedur
braucht und genau so gut diese auch entsprechend aufrufen kann, aber
die Möglichkeit mit den Makros finde ich gar nicht so schlecht <)

Was ich schon öfters gebraucht hab sind Prototypen, die zur Laufzeit
jeweils eine andere Prozedur aufrufen sollten. Um das zu bewerk-
stelligen kann man jeder Zeit den Prototypen einfach mit einem
anderen Prozedurzeiger überschreiben. (selbiges gilt für Interfaces)
Entgegen deinem Wunsch müssen die Parametertypen und die
Anzahl aber gleich sein.

Wenn du das aber unbedingt brauchst, nimm doch einfach ein Pointer
und lass dahinter eine beliebige Struktur sein. Mit einem zweiten
Parameter kannst dann übergeben, um welche Struktur es sich
handelt und entsprechend in der einen Prozedur handeln. Kein
überladen notwendig <)

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten