Switch Anweisung: Was stimmt hier nicht?

Gast #796830
Lesenswert?

Hallo allerseits

natürlich ist das 'ne blöde Frage, aber ich krieg's einfach nicht auf 
die Reihe:

Wenn ich das mit Winavr und dem AVRStudio compiliere und simuliere, oder 
auch auf dem Chip (Tiny861) laufen lasse, dann springt das Programm 
immer zum case 3.
Danke vielmals für die Hilfe! Tobias

______________________________________________

unsigned char bla=0;
unsigned char blub=0;


int main(void){
  switch(bla){
    case 0:
      blub++;
    break;

    case 1:
      blub++;
    break;

    case 3:
      blub++;
    break;
  }

}
Gast #796837
Lesenswert?

>springt das Programm immer zum case 3.

Woher wißt du das?

Ich würde anstelle des Kompilers die switch-case Verzweigung 
wegoptimieren, weil du mit der variable nichts tust und ausserdem in 
allen verzeweigungen dasselbe tust.
Persönliche Seite #796864
Lesenswert?

92:  80 91 60 00   lds  r24, 0x0060
  96:  81 30         cpi  r24, 0x01  ; 1
  98:  21 f0         breq  .+8        ; 0xa2 <main+0x10>
  9a:  81 30         cpi  r24, 0x01  ; 1
  9c:  10 f0         brcs  .+4        ; 0xa2 <main+0x10>
  9e:  83 30         cpi  r24, 0x03  ; 3
  a0:  29 f4         brne  .+10       ; 0xac <main+0x1a>
  a2:  80 91 61 00   lds  r24, 0x0061
  a6:  8f 5f         subi  r24, 0xFF  ; 255
  a8:  80 93 61 00   sts  0x0061, r24
  ac:  80 e0         ldi  r24, 0x00  ; 0
  ae:  90 e0         ldi  r25, 0x00  ; 0
  b0:  08 95         ret

Egal, ob in bla (Speicher 0x0060) 0,1, oder 3 ist, hinterher ist blub 
(0x0061) um eins erhöht.
Das macht der Compiler richtig.
Gast #796870
Lesenswert?

Wie schon gesagt, das liegt an der Optimierung! Der Compiler ignoriert 
die cases 0 und 1, weil ja eh immer das gleiche passiert. Nun sieht es 
so aus, als ob immer case 3 angesprungen wird. Schreib was 
unterschiedliches rein in die 3 Anwesungen und du wirst sehen, es geht. 
Oder schalte die Optimierung aus.
Gast #796950
Lesenswert?

Danke für die vielen Antworten!

Jetzt ists mir allmählich klar.
Natürlich hab' ich das Beispiel aus einem grösseren Programm, das ich 
grade schreibe, extrahiert. Wenn immer dasselbe passieren würde, wär' 
ich wahrscheinlich selbst draufgekommen, aber offensichtlich meint 
einfach der Compiler, dass immer dasselbe passiert.
In den verschiedenen Cases in meinem Programm wird immer derselben 
Variablen ein Wert zugewiesen, der Unterschied in den Rechnungen machen 
verschiedene Defines aus, das sieht schematisch etwa so aus:
Hier funktionierts, aber in meinem Programm ist das eine grössere 
Rechnung, bei der der Anfang jeweils gleich ist.
Ich könnte das morgen posten...

Frage aber: Wie schalte ich das Optimieren nur für diesen Programmteil 
aus?

Danke und Gruss, Tobias



_____________________________________
#define a 1
#define b 2
#define c 3

unsigned char bla=0;
unsigned char blub=0;


int main(void){
  switch(bla){
    case 0:
      blub+=a;
    break;

    case 1:
      blub+=b;
    break;

    case 3:
      blub+=c;
    break;
  }

return 1;

}
#796969
Lesenswert?

@ Tobias Z (Gast)

>Frage aber: Wie schalte ich das Optimieren nur für diesen Programmteil
>aus?

Wozu? Schalte zum Debuggen die Optimierung einfach (global) ab. Fertig. 
Wenn dann das Programm real eingesetzt werden soll compilier es mit 
Optimierung, -O2 oder -Os.

MfG
Falk
Persönliche Seite #797323
Lesenswert?

> Natürlich hab' ich das Beispiel aus einem grösseren Programm, das ich
> grade schreibe, extrahiert.

Du musst freilich noch soviel drin lassen, dass das Phänomen noch immer 
auftritt!

> Wenn immer dasselbe passieren würde, wär'
> ich wahrscheinlich selbst draufgekommen, aber offensichtlich meint
> einfach der Compiler, dass immer dasselbe passiert.

Der Compiler wird schon recht haben.

Lokale Variablen mit Werten beschreiben ist unnötig, wenn die Werte 
nicht mehr verwendet werden.

Leere Schleifen zu durchlaufen.

Grundsätzlich ist C-Code nicht geeignet Zeitverzögerungen durch Hoch 
oder herunterzählen eine Variablen zu erreichen. Der Optimirerer wirft 
alle Zeitverzögerungen hinaus.

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