Buchempfehlung
Visual Basic 6 Kochbuch
Visual Basic 6 Kochbuch
Viele praktische Tipps zum Programmieren mit Visual Basic 6, die sich oft auch auf FB übertragen lassen. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Referenz - Bitfelder

Referenz-Navigation

 

Beim Programmieren stößt man gelegentlich auf Aufgaben, bei denen man nur den Status mehrerer Objekte speichern muss, also z. B. aktiv oder nicht aktiv. Für jedes einzelne Objekt eine eigene Integer-Variable zu verwenden wäre Speicherverschwendung, da nur eines der 32 bzw. 64 Bit genutzt wird. In älteren BASIC-Dialekten wurde dieses Problem gelöst, indem man eine BefehlsreferenzeintragINTEGER-Variable benutzt und die einzelnen Bits direkt mit den logischen Operatoren manipuliert.

Beispiel: Der Status von drei Checkboxen soll in einer INTEGER-Variablen gespeichert werden:

CheckBox1 = 1 ' aktiv
CheckBox2 = 0 ' nicht aktiv
CheckBox3 = 1 ' aktiv

GesamtStatus = 0 ' Variable vorbereiten: Alle nicht aktiv

IF CheckBox1 THEN GesamtStatus = GesamtStatus OR 1
IF CheckBox2 THEN GesamtStatus = GesamtStatus OR 2
IF CheckBox3 THEN GesamtStatus = GesamtStatus OR 4

' ...Programmcode...

' Status abfragen:
If GesamtStatus AND 1 THEN CheckBox1 = 1
If GesamtStatus AND 2 THEN CheckBox2 = 1
If GesamtStatus AND 4 THEN CheckBox3 = 1

Das Problem bei dieser Methode ist, dass nicht immer klar ist, welches Bit in 'GesamtStatus' für welche Checkbox steht. Der Programmierer müsste also entweder die Belegung auswendig lernen oder ständig in seinen Notizen nachsehen, wofür welches Bit steht. Beides ist relativ mühselig.

Unter FreeBASIC wurde dieses Problem durch die sogenannten Bitfelder (die Programmierern in C/C++ bereits bekannt sein sollten) gelöst. Ein Bitfeld ist einem BefehlsreferenzeintragUDT ähnlich, unterscheidet sich von einem normalen UDT jedoch dadurch, dass jedem Element der Struktur nur Werte innerhalb eines bestimmten Bereiches zugewiesen werden können. Die Syntax für ein Bitfeld ist die folgende:

TYPE BitFeldName
   Bit1Name : Bitanzahl AS INTEGER
   Bit2Name : Bitanzahl AS INTEGER
   Bit3Name : Bitanzahl AS INTEGER
   ' ...
END TYPE
DIM Variable AS BitFeldName

In Bitfelder aufteilen lassen sich nur die Datentypen (U)BYTE, (U)SHORT, (U)INTEGER bzw. (U)LONG sowie in der 64bit-Version des Compilers der Datentyp (U)LONGINT. Alle anderen Datentypen erzeugen eine Fehlermeldung des Compilers. Die Namen der Strukturelemente können dabei frei gewählt werden. Es dürfen beliebig viele Records verwendet werden. 'Bitanzahl' ist die Anzahl der Bits, die für diesen Record verwendet werden sollen. Diese Zahl kann nicht größer sein als die Anzahl der Bits, die im angegebenen Datentyp gespeichert werden kann.

Beispiel: Checkbox-Verwaltung mit Bitfeldern:

TYPE CheckBoxenType
   CB1 : 1 AS INTEGER
   CB2 : 1 AS INTEGER
   CB3 : 1 AS INTEGER
END TYPE
DIM CheckBoxen AS CheckBoxenType

' Status setzen:
CheckBoxen.CB1 = 1 ' aktiv
CheckBoxen.CB2 = 0 ' nicht aktiv
CheckBoxen.CB3 = 1 ' aktiv

' ... Programmcode ...

' Status abfragen:
IF CheckBoxen.CB1 THEN PRINT "Bit 1 ist gesetzt."
IF CheckBoxen.CB2 THEN PRINT "Bit 2 ist gesetzt."
IF CheckBoxen.CB3 THEN PRINT "Bit 3 ist gesetzt."
SLEEP

Man erspart sich hierbei die umständliche Bitmanipulation mit AND und OR, außerdem ist sofort klar, welcher Wert gerade bearbeitet wird. Ein weiterer Vorteil ist, dass die Bitzahl nicht 1 sein muss; so können auch Checkboxen mit drei Zuständen realisiert werden (aktiviert/nicht aktiviert/nicht festgelegt).

Beispiel:

TYPE a
   a1 : 2 AS INTEGER
   a2 : 2 AS INTEGER
END TYPE
DIM b AS a

b.a1 = 5
PRINT b.a1
SLEEP

Ausgabe:

1

5 ist in Binär &b101. Da für den Record a1 nur zwei Bits verwendet werden, ignoriert FreeBASIC das dritte Bit. Statt &b101 wird in a1 also nur &b01 gespeichert, was 1 entspricht.


Zusätzliche Informationen und Funktionen
  • Der Referenzeintrag wurde am 06.08.2007 von AdministratorSebastian angelegt.
  • Die aktuellste Version wurde am 08.04.2015 von Redakteurnemored gespeichert.
  Versionen Versionen