BASCOM: Vorteil Case statt If.Then-Bedingung

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren