BASCOM: Vorteil Case statt If.Then-Bedingung

Gast #632247
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?
#632319
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.
Gast #632357
@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???
Persönliche Seite #632405
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ß...?
#632991
>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).
#633016
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
#633021
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
#633048
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
#633178
> 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)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.