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; } }
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 ;)
>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.
@ 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
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.
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.
Jetzt hast du quasi eine "oder" Verknüpfung: Wenn 0 oder 1 oder 3 auftritt wird immer case 3 angesprungen!
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; }
@ 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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.