Forum: Mikrocontroller und Digitale Elektronik Switch Anweisung: Was stimmt hier nicht?


von Tobias Z (Gast)


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;
  }

}

von Kai G. (runtimeterror)


Lesenswert?

Woran siehst du das?
blub wird in jedem Falle zu 1... vielleicht wolltest du das break 
weglassen - auch wenn man selten einen Grund dazu hat ;)

von Matthias L. (Gast)


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.

von Falk B. (falk)


Lesenswert?

@ Tobias Z (Gast)

>auch auf dem Chip (Tiny861) laufen lasse, dann springt das Programm
>immer zum case 3.

Liegt wohl daran, dass bla immer == 3 ist.

MFG
Falk

von Hans-jürgen H. (hjherbert) Benutzerseite


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.

von Tobi (Gast)


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.

von Tobi (Gast)


Lesenswert?

Jetzt hast du quasi eine "oder" Verknüpfung: Wenn 0 oder 1 oder 3 
auftritt wird immer case 3 angesprungen!

von Tobias Z (Gast)


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;

}

von Falk B. (falk)


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

von Hans-jürgen H. (hjherbert) Benutzerseite


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.

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.