Macro um Variablen variabeler Größe zu definieren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
MASH
Beiträge: 130
Registriert: 22.05.2005 17:43

Macro um Variablen variabeler Größe zu definieren

Beitrag von MASH »

Hey @all,
ich habe da mal eine simple Frage und denke die Antwort ist genauso einfach. Ich habe mir zwei Macros geschrieben die beiden Teile machen etwa das Selbe. Und zwar Deklarieren die Macros eine Variable "VARIABLE" vom Typ "SIZEVARIABLE"(Variiert je nachdem wie groß "SIZEVARIABLE" ist.). Meine Frage:

Wie kann ich das Macro schöner schreiben oder gibt es eine andere Möglichkeit diese Aktion durchzuführen?

Code: Alles auswählen

EnableExplicit

Macro DEFVSIZE1(VARIABLE, SIZEVARIABLE)
	CompilerSelect #True
		CompilerCase SIZEVARIABLE >= 0 And SIZEVARIABLE <= 255
			Define.a VARIABLE	; 1 byte
		CompilerCase SIZEVARIABLE >= 256 And SIZEVARIABLE <= 65535
			Define.u VARIABLE	; 2 byte
		CompilerCase SIZEVARIABLE >= 65536 And SIZEVARIABLE <= 2147483647
			Define.l VARIABLE	; 4 byte
		CompilerCase SIZEVARIABLE >= 2147483648 And SIZEVARIABLE <= 9223372036854775807
			Define.q VARIABLE	; 8 byte
	CompilerEndSelect
EndMacro

Macro DEFVSIZE2(VARIABLE,SIZEVARIABLE)
	CompilerIf SIZEVARIABLE < 255
		Define.a VARIABLE	; 1 byte
	CompilerElse
		CompilerIf SIZEVARIABLE < 65535
			Define.u VARIABLE	; 2 byte
		CompilerElse
			CompilerIf SIZEVARIABLE < 2147483647
				Define.l VARIABLE	; 4 byte
			CompilerElse
				Define.q VARIABLE	; 8 byte
			CompilerEndIf
		CompilerEndIf
	CompilerEndIf
EndMacro


; declare variables
DEFVSIZE1(Number1, 64)
DEFVSIZE2(Number2, 1024)
DEFVSIZE1(Number3, 80000)
DEFVSIZE2(Number4, 3500500900)

If OpenConsole()
	
	PrintN("SizeOf(Number1): " + Str(SizeOf(Number1)))
	PrintN("SizeOf(Number2): " + Str(SizeOf(Number2)))
	PrintN("SizeOf(Number3): " + Str(SizeOf(Number3)))
	PrintN("SizeOf(Number4): " + Str(SizeOf(Number4)))
	Input()
	
	CloseConsole()
EndIf

End




Danke Mark S.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Macro um Variablen variabeler Größe zu definieren

Beitrag von Nino »

gelöscht
Zuletzt geändert von Nino am 12.02.2011 23:01, insgesamt 1-mal geändert.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Macro um Variablen variabeler Größe zu definieren

Beitrag von ts-soft »

Welchen nutzen hat das Macro?
Es ist doch das einfachste und schnellste alle Variablen ausser dem Quad auf Integer zu setzen!
Der Rest macht doch nur in Strukturen oder Interfaces Sinn. Zur Überprüfung auf Werteüberschreitung
ist so eine Declaration auch nur sehr bedingt geeignet, also im grossen und ganzen macht Dein
Macro nichts sinnvolles :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
MASH
Beiträge: 130
Registriert: 22.05.2005 17:43

Re: Macro um Variablen variabeler Größe zu definieren

Beitrag von MASH »

Ja das ist so richtig eigentlich recht unnütz. Ich habe dieses Konstrukt für Strukturen angedacht. Um mehrere Versionen der Software zu erzeugen. Weil ich weiß das bestimmte Felder in der Struktur nur bestimmte Größen aufnehmen brauchen.
Danke Mark S.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Macro um Variablen variabeler Größe zu definieren

Beitrag von ts-soft »

Dein Code erzeugt aber keine Strukturen?

Code: Alles auswählen

Structure blub
 b.b
EndStructure

Define.i a = 100

Define blub.blub
blub\b = a
Debug blub\b
Debug a
und solange der Bereich nicht überschritten wird, ist der Strukture auch der Ursprung des Wertes egal.
Ob der Compiler meckert, wenn Du a.b 300 zuordnest, oder das erst passiert, wenn Du es der Strukture
zuordnest, macht IMHO keinen Unterschied.

Noch schlimmer finde ich aber Procedure.b :mrgreen:
welches viele verwenden, warum auch immer.
Oder die nichts Neues lerner, die immer noch Procedure.l statt .i schreiben.

Aber was solls, sind nur Kleinigkeiten die ja an der Funktionalität des resultierenden
Programmes nicht viel ändern. :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
MASH
Beiträge: 130
Registriert: 22.05.2005 17:43

Re: Macro um Variablen variabeler Größe zu definieren

Beitrag von MASH »

Ja da muss ich dir Recht geben. Es werden keine Strukturen erzeugt. Ich wollte aber Strukturen verwenden und habe es deshalb nochmal abgeändert. "DEFSTRUCTVSIZE1" verwende ich jetzt für die Strukturen. Aber meine Frage war ja immer noch

Gibt es etwas anderes als diese Methode?

Code: Alles auswählen

EnableExplicit

Macro DEFSTRUCTVSIZE1(VARIABLE,SIZEVARIABLE)
	CompilerSelect #True
		CompilerCase SIZEVARIABLE >= 0 And SIZEVARIABLE <= 255
			VARIABLE.a	; 1 byte
		CompilerCase SIZEVARIABLE >= 256 And SIZEVARIABLE <= 65535
			VARIABLE.u	; 2 byte
		CompilerCase SIZEVARIABLE >= 65536 And SIZEVARIABLE <= 2147483647
			VARIABLE.l	; 4 byte
		CompilerCase SIZEVARIABLE >= 2147483648 And SIZEVARIABLE <= 9223372036854775807
			VARIABLE.q	; 8 byte
	CompilerEndSelect
EndMacro


; declare structure
Structure SIZE15T
	DEFSTRUCTVSIZE1(Number1, 64)
	DEFSTRUCTVSIZE1(Number2, 1024)
	DEFSTRUCTVSIZE1(Number3, 80000)
	DEFSTRUCTVSIZE1(Number4, 3500500900)
EndStructure

Define.SIZE15T Numbers

If OpenConsole()
	
	PrintN("SizeOf(Number1): " + Str(SizeOf(Numbers\Number1)))
	PrintN("SizeOf(Number2): " + Str(SizeOf(Numbers\Number2)))
	PrintN("SizeOf(Number3): " + Str(SizeOf(Numbers\Number3)))
	PrintN("SizeOf(Number4): " + Str(SizeOf(Numbers\Number4)))
	Input()
	
	CloseConsole()
EndIf

End
Danke Mark S.
Antworten