Hallo! Ich habe eine kleine Schaltung mit einem ATMega32 aufgebaut. Auf diesem AVR laufen verschiedene Tasks die mit dem freien Multitasking System AVRX und dem GCC (Vers: 24.04.2003) compiliert wurden. Mir ist jetzt folgendes aufgefallen:
Aus einem "switch-case" Statement macht der Kompiler manchmal die tollsten Sachen und zwar immer dann wenn man bei dem "case"-Teil die zugehörigen Programmteile nicht in einem Block definiert:
Wird Stellenweise falsch kompiliert: uint8_t i=2; uint8_t a=0; switch(i) { case 0: // Einsprung wenn i=0 print("i=0"); if(a) print("----"); break; case 1: // Einsprung wenn i=1 print("i=1"); if(a>4) print("====="); break; case 2: // Einsprung wenn i=2 print("i=2"); a=4; case 3: // Einsprung wenn i=2 und i=3 print("i=2 oder 3"); if(a==3) print("a=3"); break; } Wenn ich den obigen Programmteil unter AVRX ausführe, werden die "break" Anweisungen teilweise einfach über sprungen. Wenn ich die Anweisungen hinter den case-Statements aber mit "{}" blocke, wird alles richtig kompiliert:
Wird richtig kompiliert und auch ausgeführt: uint8_t i=2; uint8_t a=0; switch(i) { case 0: { // Einsprung wenn i=0 print("i=0"); if(a) print("----"); break; } case 1: { // Einsprung wenn i=1 print("i=1"); if(a>4) print("====="); break; } case 2: { // Einsprung wenn i=2 print("i=2"); a=4; } case 3: { // Einsprung wenn i=2 und i=3 print("i=2 oder 3"); if(a==3) print("a=3"); break; } }
Ist euch das auch schon mal aufgefallen?
Gruß,
Artur