Seite 1 von 1

Macro um Variablen variabeler Größe zu definieren

Verfasst: 12.02.2011 21:45
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





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

Verfasst: 12.02.2011 21:58
von Nino
gelöscht

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

Verfasst: 12.02.2011 22:19
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:

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

Verfasst: 13.02.2011 08:47
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.

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

Verfasst: 13.02.2011 08:58
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:

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

Verfasst: 13.02.2011 10:53
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