Kann man Prozeduren in PB überladen?
Re: Kann man Prozeduren in PB überladen?
Es ist schon nett wenn man einige Funktionen mit vielen Datentypen aufrufen kann. Zum Beispiel bei der Funktion Str(),
die dann ohne Umwege mit Ascii, Byte, Character, Unicode, Word, Long, Integer, Quad, Float, Double, und Strukturen benutzt werden könnte.
Jedes mal gibt die Funktion Str() die String-Repräsentation des jeweiligen Datentyps zurück, und man braucht keine zig Funktionen
oder andere Workarounds dafür. So einfach geht es bei PB nicht, aber man gewöhnt sich daran.
Für komplexe Datentypen ist dann m.M.n. ein Interface besser, wo die Funktionen direkt mit dem Datentyp verknüpft sind,
man also statt dem globalen Str() dann Adresse\ToString(), Integer\ToString(), Node\ToString() usw. aufruft.
Oder man benutzt Module und schreibt Adresse::ToString(adr1), Integer::ToString(i), Node::ToString(n1).
Zwar alles erstmal etwas aufwendiger, ohne AutoComplete auch meist mehr zu schreiben, aber dafür bei der Wartung und Pflege des Codes
auf lange Zeit gut und klar verständlich/lesbar und eindeutig.
die dann ohne Umwege mit Ascii, Byte, Character, Unicode, Word, Long, Integer, Quad, Float, Double, und Strukturen benutzt werden könnte.
Jedes mal gibt die Funktion Str() die String-Repräsentation des jeweiligen Datentyps zurück, und man braucht keine zig Funktionen
oder andere Workarounds dafür. So einfach geht es bei PB nicht, aber man gewöhnt sich daran.
Für komplexe Datentypen ist dann m.M.n. ein Interface besser, wo die Funktionen direkt mit dem Datentyp verknüpft sind,
man also statt dem globalen Str() dann Adresse\ToString(), Integer\ToString(), Node\ToString() usw. aufruft.
Oder man benutzt Module und schreibt Adresse::ToString(adr1), Integer::ToString(i), Node::ToString(n1).
Zwar alles erstmal etwas aufwendiger, ohne AutoComplete auch meist mehr zu schreiben, aber dafür bei der Wartung und Pflege des Codes
auf lange Zeit gut und klar verständlich/lesbar und eindeutig.
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
Re: Kann man Prozeduren in PB überladen?
Ich glaube das ist gewohnheitssache, wie man seinen Code aufbaut.
Die einen schreiben gerne die Typ der Variable vor den Namen: sName, iAnzahl, fAbstand, listGegner
und benutzen dafü lieber für alle Type einen gleichen Procedurenamen: Compare()
Andere machen es lieber andersherum. Dass heißt, Variablen haben nur einen Namen: Name, Anzahl, Abstand, Gegener
und dafür haben halt die Proceduren unterschiedliche Vor- oder Nachsätze: CompareList(), CompareStrings() usw.
PB hat sich (vermutlich ungewollt) dafür zu entscheiden, eine Procedure eindeutig zu machen.
Die einen schreiben gerne die Typ der Variable vor den Namen: sName, iAnzahl, fAbstand, listGegner
und benutzen dafü lieber für alle Type einen gleichen Procedurenamen: Compare()
Andere machen es lieber andersherum. Dass heißt, Variablen haben nur einen Namen: Name, Anzahl, Abstand, Gegener
und dafür haben halt die Proceduren unterschiedliche Vor- oder Nachsätze: CompareList(), CompareStrings() usw.
PB hat sich (vermutlich ungewollt) dafür zu entscheiden, eine Procedure eindeutig zu machen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Kann man Prozeduren in PB überladen?
Andersrum wird ein Schuh draus.STARGÅTE hat geschrieben:PB hat sich (vermutlich ungewollt) dafür zu entscheiden, eine Procedure eindeutig zu machen.

PB unterstützt kein Überladen von Funktionen, also müssen wir schreiben:
Code: Alles auswählen
Str(value)
StrF(value)
StrD(value)
StrU(value,#PB_Byte)
StrU(value,#PB_Ascii)
StrU(value,#PB_Word)
StrU(value,#PB_Unicode)
StrU(value,#PB_Long)
StrU(value,#PB_Quad)
Bin(value,#PB_Byte)
Bin(value,#PB_Ascii)
Bin(value,#PB_Word)
Bin(value,#PB_Unicode)
Bin(value,#PB_Long)
Bin(value,#PB_Quad)
Hex(value,#PB_Byte)
Hex(value,#PB_Ascii)
Hex(value,#PB_Word)
Hex(value,#PB_Unicode)
Hex(value,#PB_Long)
Hex(value,#PB_Quad)
Code: Alles auswählen
Str(value)
Bin(value)
Hex(value)
Code: Alles auswählen
b.b = i.i
a.a = *pointer
c.c = q.q
Ein paar hundert oder tausend Leute verwenden PB auch ohne diese Features seit über 10 Jahren...

(...und bei dem günstigen, einmaligen Preis für (zur Zeit) 3 Plattformen, kann man kaum etwas falsch machen -
nur sollte man eventuelle Einschränkungen trotzdem vorher kennen, dann bereut man den Kauf später auch nicht)
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
Re: Kann man Prozeduren in PB überladen?
Den Typen bei Hex und Bin anzugeben hat folgenden Grund:
Somit ist dieser Parameter an diese Stelle durchaus notwenig.
UNd auf sowas:
Integer.i = ToInt(Float.f) oder
Float.f = ToFloat(Integer.i)
habe ich eigentlich keine Lust, wenns so viel einfacher ist:
Integer.i = Float.f
Float.i = Integer.f
Da muss ich wieder an damals denken, wo List, Arrays und Maps nicht in Strukturen möglich waren.
Heute unvorstellbar, wie man damals vernünftigen Codeaufbau betreiben konnte ^^
Code: Alles auswählen
Debug Hex(-1,#PB_Byte)
Debug Hex(-1,#PB_Word)
Debug Hex(-1,#PB_Long)
Debug Hex(-1,#PB_Quad)
Naja wie ich finde zum Glück! Sonst würde einige Tips und Tricks nicht mehr gehen, gerade, was Pointer zu verschiedenen Strukturen angeht.Danilo hat geschrieben:Da es bei PB nicht einmal eine gewisse Typsicherheit / Typcasting gibt, ist es eher unwahrscheinlich erweiterte Features wie das Überladen erwarten zu können.
UNd auf sowas:
Integer.i = ToInt(Float.f) oder
Float.f = ToFloat(Integer.i)
habe ich eigentlich keine Lust, wenns so viel einfacher ist:
Integer.i = Float.f
Float.i = Integer.f
Eben. Und Programmierer finden immer ein Weg, das eine oder andere, was nicht existiert, möglich zu machen.Danilo hat geschrieben:Ein paar hundert oder tausend Leute verwenden PB auch ohne diese Features seit über 10 Jahren...
Da muss ich wieder an damals denken, wo List, Arrays und Maps nicht in Strukturen möglich waren.
Heute unvorstellbar, wie man damals vernünftigen Codeaufbau betreiben konnte ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Kann man Prozeduren in PB überladen?
und folgendes:
Alles andere als toll, aber löst das Problem und lässt sich schnell erweitern...
Oder du bastelst dir Lambdakalkülzeug zusammen
Code: Alles auswählen
Procedure AddZeuch(input$)
For k=1 to CountString(input$, ",")+1
output = Add(output, Val(Trim(StringField(input$, k, ","))))
Next
ProcedureReturn output
EndProcedure
Oder du bastelst dir Lambdakalkülzeug zusammen
Re: Kann man Prozeduren in PB überladen?
Wieso soll es ein Glück sein wenn ich mich um Sachen kümmern muss die das Programm eigentlich bereits längst wissen müsste? Es ist ja nicht so als ob ich in C nicht auch Strukturen verwenden könnte oder als ob es keine *void Pointer gibt. Also wenn dich das glücklich macht...STARGÅTE hat geschrieben: Naja wie ich finde zum Glück!

Musst du doch gar ned:UNd auf sowas:
Integer.i = ToInt(Float.f) oder
Float.f = ToFloat(Integer.i)
habe ich eigentlich keine Lust,
float x;
int y;
y = x;
x = y;
PB hat schon auch seine Vorzüge. Da wär z.B. die PB-Lib die dir Platformübergreifend einiges an Werkzeug zur Verfügung stellt ohne daß ich dazu gedrängt werde bei 'nem 10-Zeiler schon irgendwelche Objekte zu bemühen und trotzdem die Freiheit habe das ganze durchaus noch ziemlich komplex zu gestalten. Kurz gesagt die Geschwindigkeit eine Aufgabe mit einem Programm zu lösen (und dabei auch fertig zu werden) - sofern die Funktionen von PB reichen oder ich nicht all zu viele Teile von fremden Libs brauche - kann durchaus gelobt werden. Aber ich seh durchaus nicht überall nur Vorteile wenn etwas fehlt das in anderen Sprachen möglich und sinnvoll ist. Insbesondere wenn etwas fehlt fängt in PB durchaus schon mal das herumtricksen und rätselraten an. Man kann zwar Libs aufmachen aber da fühl ich mich z.B. auf Linux (wo ich zwar jedemenge Sourcen und Headerfiles hätte diese aber bei weitem nicht so bequem wie in C/C++ einbinden kann) sehr oft wie ein Alien.Danilo hat geschrieben:Ein paar hundert oder tausend Leute verwenden PB auch ohne diese Features seit über 10 Jahren...
Re: Kann man Prozeduren in PB überladen?
Für die Übergabe von verschiedenen Parametertypen kann man sich auch selber etwas basteln ala Variant

Code: Alles auswählen
; Selbstgebauter Type Any ala Variant
Structure Any
type.i
StructureUnion
bVal.b
wVal.w
lVal.l
qVal.q
iVal.i
fVal.f
dVal.d
EndStructureUnion
sVal.s ; String ausserhalb da String in einer Union nicht mehr erlaubt sind
EndStructure
Macro bVal(Value)
Value\type = #PB_Byte : Value\bVal
EndMacro
Macro iVal(Value)
Value\type = #PB_Integer : Value\iVal
EndMacro
Macro sVal(Value)
Value\type = #PB_String : Value\sVal
EndMacro
Define.any var1, var2, var3
bVal(var1) = 100
iVal(var2) = -2000000000
sVal(var3) = "Hallo Welt ;)"
Procedure foo(*Value.Any)
With *Value
Select \type
Case #PB_Byte
Debug "Value ist von Type Byte: " + Str(\bVal)
Case #PB_Integer
Debug "Value ist von Type Integer: " + Str(\iVal)
Case #PB_String
Debug "Value ist von Type String: " + \sVal
EndSelect
EndWith
EndProcedure
foo(var1)
foo(var2)
foo(var3)

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Kann man Prozeduren in PB überladen?
Geht noch etwas einfacher. Aber nicht mit Konstanten...
Ist keine echte Typeüberladung, aber man kann mit einen Trick die Varible als ByRef und den Type der Variable übergeben.

Ist keine echte Typeüberladung, aber man kann mit einen Trick die Varible als ByRef und den Type der Variable übergeben.
Code: Alles auswählen
Structure Any
StructureUnion
bVal.b
wVal.w
lVal.l
iVal.i
EndStructureUnion
EndStructure
Procedure CompareValue(*v1.Any, *v2.Any, type1, type2)
Protected result
Protected helpVar1.i, helpVar2.i , *s1.string, *s2.string
If type1 = #PB_String And type2 = #PB_String
*s1 = @*v1
*s2 = @*v2
result = Bool(*s1\s = *s2\s)
ProcedureReturn result
EndIf
Select type1
Case #PB_Byte : helpVar1 = *v1\bVal
Case #PB_Word : helpVar1 = *v1\wVal
Case #PB_Long : helpVar1 = *v1\lVal
Case #PB_Integer : helpVar1 = *v1\iVal
Case #PB_String : *s1 = @*v1 : helpVar1 = Val(*s1\s)
EndSelect
Select type2
Case #PB_Byte : helpVar2 = *v2\bVal
Case #PB_Word : helpVar2 = *v2\wVal
Case #PB_Long : helpVar2 = *v2\lVal
Case #PB_Integer : helpVar2 = *v2\iVal
Case #PB_String : *s2 = @*v2 : helpVar2 = Val(*s2\s)
EndSelect
result = Bool(helpVar1 = helpVar2)
ProcedureReturn result
EndProcedure
Macro Compare(Value1, Value2)
CompareValue(@Value1, @Value2, TypeOf(Value1), TypeOf(Value2))
EndMacro
; Test
Define.b a, b
Define.i c, d
Define.s s1, s2, s3
a = 100
b = 200
c = 100
d = 200
s1 = "Hallo Welt"
s2 = "Hallo Welt"
s3 = "100"
Debug Compare(a, b)
Debug Compare(a, c)
Debug Compare(a, s3)
Debug Compare(s1,s2)
Debug Compare(s1,s3)

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Kann man Prozeduren in PB überladen?
Hi Gronkh,
mit dir hätte ich hier in dem PB Forum nicht gerechnet ^^
Jetzt gibs hier auch noch Prominente im Forum. ^^
Und ich finde Purebasic toll. ^^
Kennste das kommerzielle Game Restricted Area?
http://www.amazon.de/Vidis-Restricted-A ... words=area
Das wurde in Purebasic programmiert. ^^
Ist nen tolles Action RPG in ner Scifi Cyberpunk Welt.^^
Grüße
Manuel
mit dir hätte ich hier in dem PB Forum nicht gerechnet ^^
Jetzt gibs hier auch noch Prominente im Forum. ^^
Und ich finde Purebasic toll. ^^
Kennste das kommerzielle Game Restricted Area?
http://www.amazon.de/Vidis-Restricted-A ... words=area
Das wurde in Purebasic programmiert. ^^
Ist nen tolles Action RPG in ner Scifi Cyberpunk Welt.^^
Grüße
Manuel
The World is Cyber