Forum: Mikrocontroller und Digitale Elektronik BASCOM: Vorteil Case statt If.Then-Bedingung


von MArio (Gast)


Lesenswert?

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......

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Übersichtlichkeit?
Und der Compiler wird dies (wenn möglich) Effizenter umsetzen können 
(z.B. in einer Sprungtabelle)

von Matthias L. (Gast)


Lesenswert?

> Compiler wird dies (wenn möglich) Effizenter umsetzen können
>(z.B. in einer Sprungtabelle)

Effizient(er)...

In Bascom ;-?

von MArio (Gast)


Lesenswert?

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?

von Jack B. (jackbraun)


Lesenswert?

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.

von MArio (Gast)


Lesenswert?

1000 Dank! Also kann ich weiter die CASE-Anweisung verwenden ohne mir 
Nachteile einzuhandeln.

Allen ein schönes Wochenende!

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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.

von tastendrücker (Gast)


Lesenswert?

@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???

von Jack B. (jackbraun)


Lesenswert?

Kommt auf das Assembler-Programm an.

Meiner (AS51) kann z.B. For..next, Do..while, usw.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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ß...?

von Hannes L. (hannes)


Lesenswert?

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??

...

von Jack B. (jackbraun)


Lesenswert?

>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).

von Rolf I. (for_ro)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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

von Wolfram Q. (quehl)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

Immer diese 250prozentigen Assemblerfreaks...

Duck & weg, ganz schnell...

...

von Dietmar S (Gast)


Lesenswert?

Schaut euch doch einfach einmal den generierten Assembler code der 2 
Varianten an.............

von Jack B. (jackbraun)


Lesenswert?

> 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)

von Jack B. (jackbraun)


Lesenswert?

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
Noch kein Account? Hier anmelden.