Seite 1 von 2

Enumeration mit 2er-Potenzen

Verfasst: 07.10.2012 11:39
von CSHW89
Hi Leute,

hab mir gerade mal ein Mini-Macro gebaut mit dem man beim Enumerations in 2er-Potenz-Schritten Konstanten definieren. Dies wurde schon mehrfach im englischen Forum gewünscht, und auch ich selbst benutze des Öfteren z.B. für Flags solche Konstanten:

Code: Alles auswählen

; Hier das Macro
Macro enum2pow(_const_)
  _const_ = ((#PB_Compiler_EnumerationValue=1 And 1) + (#PB_Compiler_EnumerationValue>1 And 1) * ((#PB_Compiler_EnumerationValue-1)<<1))
EndMacro


; Erster Test für Enumeration mit 2er-Potenzen-Schritten

Enumeration 1
  enum2pow(#A1) ;1
  enum2pow(#A2) ;2
  enum2pow(#A3) ;4
  enum2pow(#A4) ;8
EndEnumeration

Debug #A1
Debug #A2
Debug #A3
Debug #A4

Debug "----------"


; Zweiter Test mit Startwert

Enumeration 1 ; Muss immer 1 sein!!!!!!
  enum2pow(#B1) * 16 ; Startwert hier multiplizieren
  enum2pow(#B2) ;32
  enum2pow(#B3) ;64
  enum2pow(#B4) ;128
EndEnumeration

Debug #B1
Debug #B2
Debug #B3
Debug #B4
lg Kevin

Re: Enumeration mit 2er-Potenzen

Verfasst: 07.10.2012 12:27
von ts-soft
:allright:
Sehr nützlich, danke

Re: Enumeration mit 2er-Potenzen

Verfasst: 07.10.2012 12:34
von RSBasic
:allright:

Re: Enumeration mit 2er-Potenzen

Verfasst: 07.10.2012 19:47
von WPö
Danke, Kevin, für's Teilen!

Ich nutze gern so etwas wie

Code: Alles auswählen

INTB_RBF = $b
INTF = $0400
usw.. Wenn Masken gebraucht werden, auch schonmal

Code: Alles auswählen

ABCDM_XYZ = $fc00
Sowas ist immer sehr übersichtlich, platzsparend und sowieso der "Amiga-Weg". :mrgreen: Bisher wurden meine Projekte auch nicht so groß, daß bei der fälligen Handarbeit Finger abgebrochen wären.

Gruß - WPö

Re: Enumeration mit 2er-Potenzen

Verfasst: 08.10.2012 11:16
von CSHW89
Ja gut, ich hab statt Hex-Zahlen immer Bin-Zahlen verwendet, also:

Code: Alles auswählen

#A = %00000001
#B = %00000010
#C = %00000100
...
Allerdings, wenn man dann doch mal ne Konstante irgendo da zwischen einfügen möchte, muss man wieder alle darunter ändern.
Ist ja auch der Sinn einer Enumeration: Eine Folge von Konstanten, ohne dass man wissen muss, welchen Wert jetzt eine bestimmte Konstante besitzt, sodass dieses "Problem" halt nicht auftaucht ;)

lg Kevin

Re: Enumeration mit 2er-Potenzen

Verfasst: 08.10.2012 13:12
von Josh
Andre hats im englischen Forum unter Wishlists gepostet

Re: Enumeration mit 2er-Potenzen

Verfasst: 21.07.2013 07:35
von Demivec
Für v5.20:

Code: Alles auswählen

Macro enum2pow(_const_)
  _const_ = (Bool(#PB_Compiler_EnumerationValue = 1) + Bool(#PB_Compiler_EnumerationValue > 1) * ((#PB_Compiler_EnumerationValue - 1) << 1))
EndMacro

@Edit: aktualisiert, danke c4s.

Re: Enumeration mit 2er-Potenzen

Verfasst: 30.07.2013 16:00
von c4s
@Demivec
Danke, aber der angepasste Code funktioniert gar nicht:
PB 5.11 Debugger hat geschrieben:Only integer constant expressions allowed for an Enumeration.
Weiß irgendjemand wie das repariert werden kann?

Re: Enumeration mit 2er-Potenzen

Verfasst: 30.07.2013 16:10
von NicTheQuick
Das funktioniert bei mir wunderbar:

Code: Alles auswählen

Macro enum2pow(_const_)
	_const_ = (Bool(#PB_Compiler_EnumerationValue = 0) + Bool(#PB_Compiler_EnumerationValue > 0) * 2 * (#PB_Compiler_EnumerationValue - 1))
EndMacro 

Enumeration
 	enum2pow(#c1)
 	enum2pow(#c2)
 	enum2pow(#c3)
 	enum2pow(#c4)
 	enum2pow(#c5)
 	enum2pow(#c6)
 	enum2pow(#c7)
EndEnumeration
 
Debug #c1
Debug #c2
Debug #c3
Debug #c4
Debug #c5
Debug #c6
Debug #c7

Re: Enumeration mit 2er-Potenzen

Verfasst: 30.07.2013 16:21
von c4s
Bei mir funktioniert auch dein Code nicht mit gleicher Fehlermeldung (PB 5.11, x86, Windows). :shock:

Edit: Gerade mal mit PB5.20b5 getestet und es funktioniert, auch Demivec's Code. :allright: