www.mikrocontroller.net

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


Autor: MArio (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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......

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: Matthias Lipinsky (lippy)
Datum:

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

Effizient(er)...

In Bascom ;-?

Autor: MArio (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jack Braun (jackbraun)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MArio (Gast)
Datum:

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

Allen ein schönes Wochenende!

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Jack Braun (jackbraun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kommt auf das Assembler-Programm an.

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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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ß...?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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??

...

Autor: Jack Braun (jackbraun)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Rolf Im forum (for_ro)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wolfram Quehl (quehl)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Immer diese 250prozentigen Assemblerfreaks...

Duck & weg, ganz schnell...

...

Autor: Dietmar S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schaut euch doch einfach einmal den generierten Assembler code der 2 
Varianten an.............

Autor: Jack Braun (jackbraun)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Jack Braun (jackbraun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Korrektur:

CASE:1 usw. ist natürlich falsch.
Richtig muß es heißen:

CASE 1 : Anweisung 1

usw.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.