Seite 1 von 3

Kann man Prozeduren in PB überladen?

Verfasst: 14.11.2013 22:58
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.

Re: Kann man Prozeduren in PB überladen?

Verfasst: 14.11.2013 23:05
von RSBasic
Überladen ist leider nicht möglich.

Re: Kann man Prozeduren in PB überladen?

Verfasst: 14.11.2013 23:13
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?

Re: Kann man Prozeduren in PB überladen?

Verfasst: 15.11.2013 00:02
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

Re: Kann man Prozeduren in PB überladen?

Verfasst: 15.11.2013 18:27
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.

Re: Kann man Prozeduren in PB überladen?

Verfasst: 15.11.2013 20:04
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.

Re: Kann man Prozeduren in PB überladen?

Verfasst: 15.11.2013 20:06
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

Re: Kann man Prozeduren in PB überladen?

Verfasst: 15.11.2013 20:15
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.

Re: Kann man Prozeduren in PB überladen?

Verfasst: 15.11.2013 23:48
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. :-)

Re: Kann man Prozeduren in PB überladen?

Verfasst: 16.11.2013 04:23
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