www.mikrocontroller.net

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


Autor: Otto Richter (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du im Code anstelle

if ( bla = 0)

if (0 == bla)

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

Autor: peter dannegger (Gast)
Datum:

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

Autor: Otto Richter (Gast)
Datum:

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

Autor: sous (Gast)
Datum:

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

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.