Hallo zusammen, ich sitze an einem Programm auf einem ATMega128, PC-Entwicklungsumgebung, gcc, Studio4 etc. Durch Zufall ist mir beim Siglestep-Betrieb ein Fehler aufgefallen, für den ich keine Erklärung habe. Das Programm läuft ind Endlosschleife for(;;), führt die switch-Anweisung aus, macht dann die Abfrage if (terminal_zeichen != 0x00 ) terminal() ; und läuft dann aber nicht weiter zum lebenszeichen, sondern springt zurück auf die switch-Anweisung. Warum, was mache ich falsch ? ...und warum bekomme ich eine warnig, wenn ich ohne Rückgabewert arbeite, also void main (void) statt int main (void) ? Danke ! ...und hier der Code: int main (void) ...... /* HAUPTSCHLEIFE: Run forever */ for (;;) { switch ( taste ) { case taste_video: taste_vid_gedrueckt () ; break ; /* Video */ case taste_audio: taste_aud_gedrueckt () ; break ; /* Audio */ case taste_system: taste_sys_gedrueckt() ; break; /* System */ case taste_status: taste_status_gedrueckt();break; /*Status */ case taste_links: taste_li_gedrueckt () ; break ; /* LINKS */ case taste_up: taste_up_gedrueckt () ; break ; /* UP */ case taste_down: taste_dwn_gedrueckt () ; break ; /* DOWN */ case taste_rechts: taste_re_gedrueckt() ; break ; /* RECHTS */ case taste_esc: taste_esc_gedrueckt () ; break ; /* ESC */ case taste_ent: taste_ent_gedrueckt () ; break ; /* ENT */ default: ; /* Fehlerbehandlung */ } /* switch */ if (terminal_zeichen != 0x00 ) terminal() ; lebenszeichen = lebenszeichen + 1 ; if ((lebenszeichen = 0) && (led_encode_ist_an = 0xFF)) { led_encode_ist_an = 0x00 ; led_encode_aus () ; } if ((lebenszeichen = 0) && (led_encode_ist_an = 0x00)) { led_encode_ist_an = 0xFF ; led_encode_an () ; } } /* Ende for (;;) */ return 0 ; /* um Compiler-Warning zu unterdrücken */ } /* end of main */
Das Problem ist die Wertzuweisung "lebenszeichen = 0" statt der logischen Abfrage "lebenszeichen == 0" und dito bei der Abfrage des LED Zustands. Die Wertzuweisung xyz = 0 hat immer den logischen Wert 0 und der if Fall ist an dieser Stelle schon entschieden... Gruß Stefan
Dir ist schon klar, dass Du vergleiche in "c" nicht mit einfachem Gleichheitszeichen, sondern mit doppelten Gleichheitszeichen machst?
wenn du im Code anstelle if ( bla = 0) if (0 == bla) verwendest fallen solchen Fehlernoch eher auf weil der Compiler schön meckert ;-)....
Die neuen WINAVRs sind eigentlich sehr geschwätzig, da muß man schon if ( (bla = 0) ) schreiben, damits keine Warnung gibt. Aber leider gucken viele nur, ob ein Hex-File entstanden ist und überlesen Warnungen einfach. Warscheinlich muß jeder erstmal 14 Tage umsonst debuggen ehe er Warnungen ernst nimmt. Peter
An alle ! ...peinlich, peinlich ! Ich dachte ich hab' genau geguckt und hab' den Fehler in einer ganz anderen Richtung gesucht: Meine Ausrede: bin 57 Jahre und habe erst vor 3 Monaten mit C/WinAvr angefangen. Danke an alle ! Otto ; // Semikolon nicht vergessen !! (Irgendwann bin ich gut genug, auch Antworten schreiben zu können)
Ich glaube, diesen Fehler hat jeder schon mindestens einmal gemacht und dann stundenlang gesucht. Dazu braucht man nicht 57 Jahre alt und ein Neuling im Geschäft zu sein. ;) Gruß, Michael
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.