Seite 1 von 1

Anderer Ansatz für SelectBlock mit durchgehender Zahlenfolge

Verfasst: 24.05.2006 16:14
von Franky
Hi Leute 8)

Zuerstmal: Was ist das hier?

Wie der Titel schon sagt, ist es ein anderer Ansatz für nen Selectblock.

Wichtig: Dieser muss durchgehend sein, also 0, 1, 2, 3, 4....
Nicht 0,1, 3, 5, 17....

Was macht PB:
Wert von Select einlesen
Test: Ist es 0?
Nein
Test: ist es 1?
Nein
Test.......

Bis der Richtige Wert gefunden wurde.
Ausführen....
Zum Ende springen....

Was macht dieses Hier?
Wert von Select einlesen
Wert* 4 nehmen mittels SAL
Wert vom Grundlabel addieren
Zum Label springen
Ausführen
Zum Ende Springen

Code: Alles auswählen

;|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|
;| Select-Ersatz für durchgehende Zahlenreihen |
;| Made by Franky                      |
;| Made with PB 4.0                            |
;|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|

Global X.l=0 ;Der Anfangswert halt; Der Wert für die Select-Anweisung
;Hier kommt der Ganze Select-Kram, hier beginnt das programm zu arbeiten
neupos:
  MOV ebx,x   ;X ist der Wert, den Case normal hätte.
  SAL ebx,2   ;Da die Differenz zwischen 2 Labelzeigern 4 beträgt (long)
  ADD ebx,l_sprungmarken_select1;Nun noch das Grundlabel addieren   
  JMP dword[ebx]     ;Und Zum zeiger springen, der an der Stelle angegeben ist

endpos:
  MessageRequester("Glückwunsch","Sie haben es soeben geschafft, das Programm zu beenden")
End 

;Section mit den Case-Anweisungen  
;Diese Labels stellen die eigentlichen Teile dar, die In Case aufgerufen werden
;-------------------------------------------------------------------------------------
Case_0:
        MessageRequester("Ergebnis:","Das Ergebnis ist 0")
        JMP l_endpos ;Hinspringen, wo das Programm weiter gehen soll, in diesem Falle wieder zum Anfang
Case_1:
        MessageRequester("Ergebnis:","Das Ergebnis ist 1")
        JMP l_endpos
Case_2:
        MessageRequester("Ergebnis:","Das Ergebnis ist 2")
        JMP l_endpos
Case_3:
        MessageRequester("Ergebnis:","Das Ergebnis ist 3")
        JMP l_endpos
Case_4:
        MessageRequester("Ergebnis:","Das Ergebnis ist 4")
        JMP l_endpos
;-----------------------------------------------------------------------------------
  
DataSection 
sprungmarken_select1:
  Data.l ?Case_0,?Case_1,?Case_2,?Case_3,?Case_4
EndDataSection  

Was bringt das?
Speed.
In meinem Beispiel ist es glaub ich noch etwas langsamer, als die herkömmliche Variante.
Da aber bei dieser Herkömmlichen bei durchgehender Reihe abgefragten Selectsache ein

Code: Alles auswählen

  MOV    ebx,1
  CMP    ebx,[esp]
  JNE   _Case2
hinzukommt, sollte meins spätestens ab 10 Abfragen schneller sein (sofern der wert nicht immer 0 beträgt, da hat PB dann doch vorteile).

Verfasst: 24.05.2006 17:36
von Kaeru Gaman
deine idee schaut interessant aus. :allright:

betutzbar im grunde für jede folge mit regelmäßigen abständen,
man muss halt dementsprechend umrechnen.

nur, regelmässige abstände in Select-Case zu verarbeiten, ist imho eher die ausnahme,

gerade für scheinbar willkürliche werte ist Case die mächtige lösung.
für besonders regelmäßige werte gibt es oft andere lösungen.