Seite 1 von 1
Eigener Datentyp definierbar ?
Verfasst: 21.05.2014 14:24
von CodeCommander
Kann man einen eigenen Datentyp definieren und einen Wert in der mit dem Datentyp definierten Variable schreiben? Dabei geht es auch darum zu definieren wie groß der Speicherbereich eines Datentyps ist und was für Werte zulässig sind. Geht das irgendwie wenn ja wie?
Re: Eigener Datentyp definierbar ?
Verfasst: 21.05.2014 15:21
von STARGÅTE
Mit Strukturen.
Wenn du mit "zulässigen Werte" sowas meinst wie: 0-100
Dann geht das nicht direkt zu definieren.
Das musst du beim Setzen selbst prüfen.
Verfasst: 21.05.2014 15:25
von CodeCommander
Ach so cool. Kann man auch einen Getter und Setter definieren? Kann man irgendwie festlegen das jedesmal automatisch eine bestimmte Prozedure aufgerufen wird wenn ich den Wert einer Variable meines Datentyps ändern möchte?
Re: Eigener Datentyp definierbar ?
Verfasst: 21.05.2014 15:32
von STARGÅTE
Definiere dir doch gleich eine Prozedure, zum setzen deiner Variable:
Code: Alles auswählen
Structure Sound
Volume.i
Balance.i
EndStructure
Procedure SetSound(*Sound.Sound, Volume.i, Balance.i)
If Volume < 0
*Sound\Volume = 0
ElseIf Volume > 100
*Sound\Volume = 100
Else
*Sound\Volume = Volume
EndIf
If Balance < -100
*Sound\Balance = -100
ElseIf Balance > 100
*Sound\Balance = 100
Else
*Sound\Balance = Balance
EndIf
EndProcedure
Define MySound.Sound
SetSound(MySound, 65, 10)
Debug MySound\Balance
SetSound(MySound, -50, -50)
Debug MySound\Volume
Dort kannst du dann gleich prüfen.
Re: Eigener Datentyp definierbar ?
Verfasst: 21.05.2014 15:42
von NicTheQuick
Wenn du so schöne Sachen benutzen willst, dann musst du C/C++ programmieren. Dann kannst du den =-Operator überschreiben und fertig.
Nee, mal im Ernst. In Purebasic geht das nicht so ohne weiteres. Man kann das ganze relativ schön mit Interfaces lösen, aber das ist teilweise auch ein Krampf und man muss sich damit auskennen, damit man keinen Unsinn treibt.
Verfasst: 21.05.2014 15:52
von CodeCommander
Das geht schon mal in die richtige Richtung. Danke

Ich kenn mich mit Macros nicht so gut aus aber könnte man es auch zusätzlich mit Macros so machen das am Ende so aussieht?
Das wäre schön wenn das ginge aber ich glaube nicht dass das geht oder?
Es wär allgemein toll wenn man mehr Freiheiten bez. Macros hätte, dann man auch andere Dinge im Code ersetzen und modifizieren könnte.

Re: Eigener Datentyp definierbar ?
Verfasst: 22.05.2014 20:04
von Sauer-RAM
Da kommt wohl jemand aus der Objektorientierten Programmierung mh? ^^
Aber auch in PB, kann man gets und sets Programmieren. Ist halt nur einfach relativ unsinnig :P
Re: Eigener Datentyp definierbar ?
Verfasst: 22.05.2014 22:17
von Derren
Sauer-RAM hat geschrieben:Ist halt nur einfach relativ unsinnig :P
Finde ich nicht. Bringt zwar keine Vorteile, ist vielleicht sogar langsamer, aber die Lesbarkeit des Codes (vor allem, wenn man es so gewohnt ist) kann damit verbessert werden.
Ich bin z.B. inzwischen dazu übergegangen Variablen in Modulen zu kapseln und dann mit
myModule::var zu arbeiten. Nachdem man Modulen eine extra Farbe zuweisen kann, stechen die Variablen, bzw der "Namespace" besser hervor als bei "Kategorie_Variable".
Zum Thema Getter, Setter und Konstruktor (Funktion, die beim Definieren einer Variable (eigtl. beim Erstellen eines Objekts) automatisch ausgeführt wird):
Das hier ist natürlich totaler Overkill, aber wenn er es denn so will, bitte sehr
Code: Alles auswählen
Macro Define(variable)
DeclareModule variable
Define var.s = "Default"
Declare.s Get()
Declare Set(value.s)
EndDeclareModule
Module variable
Procedure.s Get()
Shared var
ProcedureReturn var
EndProcedure
Procedure Set(value.s)
Shared var
var = value
EndProcedure
EndModule
EndMacro
Define(mySound)
Debug mySound::Get()
mySound::Set("OK. Changed it now")
Debug mySound::Get()
Oder hier, sogar mit "magischer Funktion" __construct()
Code: Alles auswählen
Macro Define(variable)
DeclareModule variable
Define var.s
Declare.s Get()
Declare Set(value.s)
Declare __construct()
EndDeclareModule
Module variable
Procedure __construct()
Shared var
var = "Default (set by Constructor function)"
EndProcedure
Procedure.s Get()
Shared var
ProcedureReturn var
EndProcedure
Procedure Set(value.s)
Shared var
var = value
EndProcedure
EndModule
variable#::__construct() ;Beim "Erstellen" einer Variable wird automatisch die __construct() Funktion aufgerufen
EndMacro
Define(mySound)
Debug mySound::Get()
;mySound::Set("OK. Changed it now")
;Debug mySound::Get()