Hallo zusammen, kann mir bitte einmal jemand erklären was der Vorteil von CASE gegenüber einer IF...Then-Abfrage ist? Vielen Dank schon einmal......
Übersichtlichkeit? Und der Compiler wird dies (wenn möglich) Effizenter umsetzen können (z.B. in einer Sprungtabelle)
> Compiler wird dies (wenn möglich) Effizenter umsetzen können >(z.B. in einer Sprungtabelle) Effizient(er)... In Bascom ;-?
Wow, das war ja ne schnelle Reaktion, vielen Dank (@Läubi) Die Übersichtlichkeit sehe ich in diesem Falle genauso, die Effizienz ist mir nicht ganz klar, heist das, daß ein CASE weniger Speicher benötigt als eine IF...THEN-Bedingung?
IF..THEN übersetzt der Compiler als bedingten Sprungbefehl nach END IF (wird vom Compiler als Label übersetzt). Jede einzelne CASE Anweisung wird von Bascom wie ein IF..THEN behandelt. Übrig bleibt als Vorteil nur die bessere Lesbarkeit der CASE Anweisung.
1000 Dank! Also kann ich weiter die CASE-Anweisung verwenden ohne mir Nachteile einzuhandeln. Allen ein schönes Wochenende!
Hm... gut, wenn BASCOM das eh intern umsezt isses egal. Aber, generell ist ein CASE einer endlosen IF/THEN/ELSE Vorzuziehen. @MArio: Ja das (kann) Ausführungszeit und Codegröße sparen. Benutz ich auch öters mal (aber nur in Assembler) um mir elendig lange if/then/else sachen zu sparen.
@Läubi >Ja das (kann) Ausführungszeit und Codegröße sparen. Benutz ich auch >öters mal (aber nur in Assembler) um mir elendig lange if/then/else >sachen zu sparen. Du benutzt CASE in Assembler???
Kommt auf das Assembler-Programm an. Meiner (AS51) kann z.B. For..next, Do..while, usw.
tastendrücker wrote: > @Läubi >>Ja das (kann) Ausführungszeit und Codegröße sparen. Benutz ich auch >>öters mal (aber nur in Assembler) um mir elendig lange if/then/else >>sachen zu sparen. > > Du benutzt CASE in Assembler??? CASE als schlüsselwort gibt es zwar nicht, aber ich kann ja mein eigenes "case" Programmieren oder nicht? ;) Ich denk grad etwas drüber nach und Frag mich: Wenn BASCOM CASE Anweisung in IF/THEN/ELSE übersezt, dauern dann "spätere" CASE länger als frühere? Da er ja erstmal durch alle vorherigen "falschen" durchrattern muß...?
tastendrücker wrote: > > Du benutzt CASE in Assembler??? Warum nicht? Mache ich auch, und zwar in Form von ICALL oder IJMP. Wo ist das Problem?? ...
>dauern dann "spätere" CASE länger als frühere? >Da er ja erstmal durch alle vorherigen "falschen" durchrattern muß...? Ja. Kleiner Nachtrag: Die CASE Anweisung bewirkt, daß nach einem erfolgreichen Vergleich und nach Ausführung der entsprechenden Anweisung direkt END SELECT angesprungen wird. Also doch eine Verbesserung gegenüber einzelnen IF..THEN..END IF Konstrukten. Allerdings werden alle vorhergehenden Vergleiche durchlaufen (Also nix mit Sprungtabelle).
Jack Braun wrote: > Die CASE Anweisung bewirkt, daß nach einem erfolgreichen Vergleich und > nach Ausführung der entsprechenden Anweisung direkt END SELECT > angesprungen wird. Also doch eine Verbesserung gegenüber einzelnen > IF..THEN..END IF Konstrukten. Du meinst, der geht die anderen elseif und else noch durch, wenn er eine zutreffende Bedingung gefunden hat? Halte ich für äußerst unwahrscheinlich. Der wird da genauso direkt die End IF anspringen, alles andere wäre eher peinlich. Gruß Rolf
Rolf Im forum wrote: > Jack Braun wrote: > >> Die CASE Anweisung bewirkt, daß nach einem erfolgreichen Vergleich und >> nach Ausführung der entsprechenden Anweisung direkt END SELECT >> angesprungen wird. Also doch eine Verbesserung gegenüber einzelnen >> IF..THEN..END IF Konstrukten. > > Du meinst, der geht die anderen elseif und else noch durch, wenn er eine > zutreffende Bedingung gefunden hat? Nein, er meint vermutlich, er prüft alle Fälle BIS er den Zutreffenden gefunden hat, danach gehts zum Ende. Verzweigung mittels Sprungtabelle und IJMP dagegen ermittelt direkt aus dem Wert der Variable das Sprungziel. Somit dauert die Verzweigung in allen Fällen gleich lange. > Halte ich für äußerst > unwahrscheinlich. > Der wird da genauso direkt die End IF anspringen, alles andere wäre eher > peinlich. > > Gruß > > Rolf
also, wenn Bascom das nicht richtig macht, sehe ich das als Programmfehler an und würde das reklamieren, wenn ich das bezahlt hätte. Darum ist es besser, gleich in Assembler zu programmieren, da weiß man, was man macht. Steht das eigentlich in der Beschreibung, daß Case nicht richtig umgesetzt wird? mfg
Immer diese 250prozentigen Assemblerfreaks... Duck & weg, ganz schnell... ...
Schaut euch doch einfach einmal den generierten Assembler code der 2 Varianten an.............
> Steht das eigentlich in der Beschreibung, daß Case nicht >richtig umgesetzt wird? Na ja, die Umsetzung der CASE Anweisung ist halt ein wenig "brav". Also: CASE: 1 CASE: 2 CASE: 3 wird zu CPI R16, 0x01 ;R16 enhält die CASE Variable BREQ PC+0x02 ;Sprung zu Anweisung 1 RJMP PC+0x0005 ;Sprung zum nächsten CASE (Anweisung 1, endet mit rjmp END SELECT) CPI R16, 0x02 BREQ PC+0x02 RJMP PC+0x0005 (Anweisung 2, endet mit rjmp END SELECT) CPI R16, 0x03 BREQ PC+0x02 RJMP PC+0x0005 (Anweisung 3, endet mit rjmp END SELECT)
Korrektur: CASE:1 usw. ist natürlich falsch. Richtig muß es heißen: CASE 1 : Anweisung 1 usw.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.