Anderer Ansatz für SelectBlock mit durchgehender Zahlenfolge

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
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Anderer Ansatz für SelectBlock mit durchgehender Zahlenfolge

Beitrag 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).
Zuletzt geändert von Franky am 08.05.2014 18:57, insgesamt 1-mal geändert.
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten