Flag System
Übersicht

![]() |
JolinahBetreff: Flag System |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Dabei wäre es soo einfach ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group