Enumeration mit 2er-Potenzen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Enumeration mit 2er-Potenzen

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
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: Enumeration mit 2er-Potenzen

Beitrag von ts-soft »

:allright:
Sehr nützlich, danke
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
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Enumeration mit 2er-Potenzen

Beitrag von RSBasic »

:allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: Enumeration mit 2er-Potenzen

Beitrag 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ö
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Enumeration mit 2er-Potenzen

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Enumeration mit 2er-Potenzen

Beitrag von Josh »

Andre hats im englischen Forum unter Wishlists gepostet
Demivec
Beiträge: 49
Registriert: 22.02.2008 20:49
Wohnort: Utah, USA

Re: Enumeration mit 2er-Potenzen

Beitrag 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.
Zuletzt geändert von Demivec am 30.07.2013 16:34, insgesamt 1-mal geändert.
Bild
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Enumeration mit 2er-Potenzen

Beitrag 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?
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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: Enumeration mit 2er-Potenzen

Beitrag 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
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Enumeration mit 2er-Potenzen

Beitrag 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:
Zuletzt geändert von c4s am 30.07.2013 16:25, insgesamt 1-mal geändert.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Antworten