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. :D

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?

Code: Alles auswählen

MySound = 5
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. :D

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()