Flag System

Übersicht BlitzBasic DLLs und Userlibs

Neue Antwort erstellen

Jolinah

Betreff: Flag System

BeitragMi, Sep 08, 2004 2:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Da es in BB keine (ausser ~ (not)) binären Operatoren gibt aber ich dachte das man damit doch ganz gut nen Flag System wie bei C usw. programmieren könnte hab ich ne ganz kleine DLL in C geschrieben.

Naja programmieren ist vielleicht der falsche Ausdruck. Ist ja eigentlich eine Gegebenheit die sich durch das ganze Bit System ergibt.

Ich denke es würde auch gehen in Blitz ohne den Umweg. Aber bestimmt viel langsamer, da man da dann jedes einzelne Bit manuell vergleichen müsste.

Also die Lib stellt 3 einfache Funktionen zur Verfügung.

Code: [AUSKLAPPEN]
AddFlag%(var%, flag%)
RemoveFlag%(var%, flag%)
CheckForFlag%(var%, flag%)


Beispiel:

Code: [AUSKLAPPEN]

Const FLAG_NEWSADMIN = 1
Const FLAG_TEMPLATEADMIN = 2
Const FLAG_SUPERADMIN = 4

flag = FLAG_NEWSADMIN  ;Das kann man noch so setzen weil noch nix anderes ist.
;Nun wird ein anderes Flag hinzugefügt. Entspricht dann 1 + 2 = 3
flag = AddFlag(flag,FLAG_TEMPLATEADMIN)

;Oder eines wegnehmen, entspricht 3 - 1 = 2
flag = RemoveFlag(flag,FLAG_NEWSADMIN)

;Und nun prüfen:
If CheckForFlag(flag,FLAG_NEWSADMIN) then
  RuntimeError("Diese Zeile wird nicht ausgeführt. Das flag ist nicht mehr gesetzt.")
Endif

If CheckForFlag(flag, FLAG_TEMPLATEADMIN) then
  ;Das wird ausgeführt. Auch wenn neben diesem Flag noch ein anderes vorhanden ist
Endif


Download:

Einfach ins userlibs verzeichnis entpacken und BB neu starten.

http://zehr.gamers24.net/blitz3d/Flags.zip


PS: Ich denke die meisten wissen wie Flags funktionieren aber trotzdem ne kleine Info.

Zuerst definiert man die Flags, welche nur einen Zustand wiedergeben.
Dabei ist zu beachten das das erste Flag 1 ist und die nachfolgenden immer (letztes Flag * 2). Somit kann man dann in 1 variable mehrere Zustände speichern. Der Vorteil an Flags ist ausserdem dass dadurch mehrere Zustände gleichzeitig aktiv sein können. Wenn man es ohne Binäre Operatoren macht kann man ja immer nur 1 Wert festhalten den man dann wieder ausliest.

Das ganze sollte man ja schon von LoadTexture usw. kennen, das sind ja auch Flags.

Also man kann sich das vorstellen als eine Liste wo drauf steht was es alles gibt. Sie kann leer sein aber sie kann auch mehrere Einträge haben nicht nur einen. Nun kann man prüfen ob der eine Eintrag vorhanden ist. Nebenbei können natürlich trotzdem noch 10 andere drauf stehen.

BladeRunner

Moderator

BeitragMi, Sep 08, 2004 6:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Function addflag(var,flag)
   var= (var And ($ffffffff-2^flag))+2^flag
   Return var
End Function

Function removeflag(var,flag)
   var= var And ($ffffffff-2^flag)
   Return var
End Function

Function checkforflag(var,flag)
   If (var And 2^flag)= 2^flag Then
      Return 1
   Else
      Return 0
   End If
End Function
Function switchflag(var,flag)
   If (var And 2^flag)= 2^flag Then
      var= var And ($ffffffff-2^flag)
   Else
      var= (var And ($ffffffff-2^flag))+2^flag
   End If
   Return var
End Function


Also ich denke nicht dass der Aufruf der Dll wesentlich schneller als die obigen Funktionen ist (hab noch eine Switch-Funktion hinzugefügt, schaltet das Flag in den jeweils anderen Zustand).
Ausserdem beginnen Flags bei Bit 0 (Wert 0 oder 1) und gehen (bei BB) bis 31, d.h. eine Variable kann bis zu 32 Flags enthalten.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Jolinah

BeitragMi, Sep 08, 2004 11:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm das es so einfach geht mit BB hätt ich echt nicht gedacht. Ich hatte schon versucht das ganze mit Rechnen usw. zu machen (nur mit Ints wie du), aber hab nicht durchgeblickt, danke Wink

Dabei wäre es soo einfach Wink

Das mit Bit 0 wusste ich, aber für mich gibt es nie soviel Sinn weil bei mir 0 meistens bedeutet das gar nichts gesetzt ist. Ich könnte da natürlich nen Flag draus machen FLAG_NONE oder so.. aber das brauch ich nicht.
Es gibt jedoch Anwendungen wo man das 0 durchaus als Flag brauchen könnte da hast du recht.
 

Dreamora

BeitragMi, Sep 08, 2004 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Glaube du verstehst das falsch: Bit 0 kann ja auch den Wert 1 haben, der muss nicht zwangsweise 0 sein ( so kommt die Zahl 1 zu stande )
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Jolinah

BeitragMi, Sep 08, 2004 17:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub er meinte aber die Zahl 0 selber auch als ein Flag nutzen.
Denn Bit 1 hab ich ja benutzt. Hab meinem ersten Flag den Wert 1 zugewiesen.

Aber für mich gibts nicht wirklich Sinn 0 als Flag zu benutzen. Denn wenn ich FLAG_VOICE = 0 machen würde dann wäre das Standardmässig immer gesetzt.


Edit:

Oder er hat mich im ersten Post einfach falsch verstanden wo ich schrieb das erste Flag muss 1 sein. Damit meine ich Wert 1, nicht Bit 1 sondern Bit 0 Wink

Vertex

BeitragMi, Sep 08, 2004 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Jaja die Logik...
Code: [AUSKLAPPEN]
; Dateiattribute
Const SCHREIBEN = %00000001
Const LESEN     = %00000010
Const PASSWORT  = %00000100

; Lesen und Schreiben
Wert = LESEN OR SCHREIBEN ; Es geht auch SCHREIBEN OR LESEN

; Attribute ausgeben
If Wert And SCHREIBEN Then
   Print "Beschreibbar"
EndIf

If Wert And LESEN Then
   Print "Lesbar"
EndIf

If Wert AND PASSWORT Then
   Print "Passwortschutz"
EndIf
Print ""

; Schreiben entfernen
Wert = Wert Xor SCHREIBEN

; Attribute ausgeben
If Wert And SCHREIBEN Then
   Print "Beschreibbar"
EndIf

If Wert And LESEN Then
   Print "Lesbar"
EndIf

If Wert AND PASSWORT Then
   Print "Passwortschutz"
EndIf
Print ""

; Passwortschutz hinzufügen
Wert = Wert Or PASSWORT

; Attribute ausgeben
If Wert And SCHREIBEN Then
   Print "Beschreibbar"
EndIf

If Wert And LESEN Then
   Print "Lesbar"
EndIf

If Wert AND PASSWORT Then
   Print "Passwortschutz"
EndIf

WaitKey


mfg olli
vertex.dreamfall.at | GitHub

Neue Antwort erstellen


Übersicht BlitzBasic DLLs und Userlibs

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group