Forum: Compiler & IDEs Warum wird main nicht bis zum Ende durchlaufen ?


von Otto Richter (Gast)


Lesenswert?

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  */

von Stefan (Gast)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

Dir ist schon klar, dass Du vergleiche in "c" nicht mit einfachem
Gleichheitszeichen, sondern mit doppelten Gleichheitszeichen machst?

von Daniel (Gast)


Lesenswert?

wenn du im Code anstelle

if ( bla = 0)

if (0 == bla)

verwendest fallen solchen Fehlernoch  eher auf weil der Compiler schön
meckert ;-)....

von peter dannegger (Gast)


Lesenswert?

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

von Otto Richter (Gast)


Lesenswert?

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)

von sous (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.