Eigener Datentyp definierbar ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
CodeCommander
Beiträge: 213
Registriert: 02.03.2014 16:06

Eigener Datentyp definierbar ?

Beitrag 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?
Zuletzt geändert von CodeCommander am 18.01.2015 14:23, insgesamt 1-mal geändert.
~ DELETE ~
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Eigener Datentyp definierbar ?

Beitrag 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.
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
Benutzeravatar
CodeCommander
Beiträge: 213
Registriert: 02.03.2014 16:06

Beitrag 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?
Zuletzt geändert von CodeCommander am 18.01.2015 14:23, insgesamt 1-mal geändert.
~ DELETE ~
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Eigener Datentyp definierbar ?

Beitrag 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.
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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
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: Eigener Datentyp definierbar ?

Beitrag 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.
Benutzeravatar
CodeCommander
Beiträge: 213
Registriert: 02.03.2014 16:06

Beitrag 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
Zuletzt geändert von CodeCommander am 18.01.2015 14:22, insgesamt 1-mal geändert.
~ DELETE ~
Benutzeravatar
Sauer-RAM
Beiträge: 326
Registriert: 13.04.2009 16:22
Computerausstattung: Lenovo ThinkPad X230t Convertible
Wohnort: Haslach i. K.

Re: Eigener Datentyp definierbar ?

Beitrag 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
"Bildung kommt vom Bildschirm und nicht vom Buch, sonst hieße es ja Buchung."
Dieter Hildebrandt
"Bildung ist Das, was übrig bleibt, wenn man alles was man in der Schule gelernt hat, vergisst. "
Albert Einstein
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Eigener Datentyp definierbar ?

Beitrag 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()
Signatur und so
Antworten