mikrocontroller.net

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


Autor: Tobias Z (Gast)
Datum:

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

}

Autor: Kai G. (runtimeterror)
Datum:

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

Autor: Matthias Lipinsky (lippy)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: Hans-jürgen Herbert (hjherbert) Benutzerseite
Datum:

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

Autor: Tobi (Gast)
Datum:

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

Autor: Tobi (Gast)
Datum:

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

Autor: Tobias Z (Gast)
Datum:

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

}

Autor: Falk Brunner (falk)
Datum:

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

Autor: Hans-jürgen Herbert (hjherbert) Benutzerseite
Datum:

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

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.