www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Switch Case überspringt break;


Autor: M. D. (derdiek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo..
Habe folgendes Problem:

Habe eine Funktion geschrieben in der eine switch-case Anweisung steht.
In die Funktion übergebe ich eine Int-Variable zum steuern.
Das ganze läuft auf einem 8051 Controller.

Das ganze sieht bei mir so aus (zusammengefasst):
void funktion(int)

int main(void)
{
   funktion(0)
   return 0;
} 

void funktion(int fall)
{
   int lauf, y=0;
   unsigned char aufforderung[16]="Frequenz in Hz: ";
   unsigned char bestaetigung[3]="OK";
   unsigned char fehleingabe[14]="Fehleingabe!";
   
   switch(fall)
      case 2: //OK!
         y=strlen(bestaetigung);
         for(lauf=0;lauf<=y;lauf++)
         {
            SBUF=bestaetigung[lauf];
            Warte10Us(200);
         }
         break;
     
      case 3: //Fehleingabe!
         y=strlen(fehleingabe);
         for(lauf=0;lauf<=y;lauf++)
         {
            SBUF=fehleingabe[lauf];
            Warte10Us(200);
         }
         break;
     
      default: //Frequenz in Hz: 
         y=strlen(aufforderung);
         for(lauf=0;lauf<=y;lauf++)
         {
            SBUF=aufforderung[lauf];
            Warte10Us(200);
         }
   }     
}

Das Problem was ich habe, ist das wenn ich jetzt die Funktion mit 0 
aufrufe, immer die Fälle default und 2 nacheinander abgerufen werden.
Kommentiere ich Case 2 aus, nimmt er anstelle dessen Case 3.

Case 2 und Case 3 funktionieren hingegen auch einzeln.
Benenne ich default in Case 1 um, und rufe dann mit (1) auf nimmt er 
trotzdem Case 2 mit dazu.

Muss ich beim Controller vielleicht noch was beachten?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schreib mal bei default auch noch ein break hin.

Autor: tek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehlt da nicht noch ein
{
 nach Switch

Autor: Markus ---- (mrmccrash)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach dem switch() fehl ein { - falsch übernommen?

_.-=: MFG :=-._

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Problem hat nichts mit dem switch-case zu tun
  unsigned char aufforderung[16]="Frequenz in Hz: ";

das Array ist um 1 Zeichen zu kurz dimensioniert und damit hat dieser 
String keine 0-Terminierung und geht nahtlos in den nächsten String über 
(Insofern hast du Glück gehabt. Bei einer anderen Reihenfolge hättest du 
den halben Speicher rausgedumpt, ehe dann mal irgendwo ein 0 Byte 
gekommen wäre)

Lass doch den Compiler die Zeichen abzählen, dann passiert dir sowas 
nicht!

  unsigned char aufforderung[]="Frequenz in Hz: ";

oder noch besser
  const char * aufforderung = "Frequenz in Hz: ";

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M. D. schrieb:
> unsigned char aufforderung[16]="Frequenz in Hz: ";

Hast du da mal nachgezählt?

Oliver
P.S.
mit
unsigned char aufforderung[]="Frequenz in Hz: ";
wäre das nicht passiert.

Autor: Sven H. (dsb_sven)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> schreib mal bei default auch noch ein break hin.

Müsste dann nicht ein switch-case ohne breaks eine Endlosschleife 
bilden?

Autor: M. D. (derdiek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry mein Fehler, den { nach dem Switch hatte ich beim übernehmen 
vergessen.
Der ist im richtigen Programm drin.

Das mit dem break beim default hatte ich nicht gemacht weil ich immer 
dachte break ist dafür da bis zum Ende des Blocks zu springen.
Werds aber mal ausprobieren.

Schonma danke

Autor: M. D. (derdiek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wahnsinn wie schnell die Antworten kommen!

Ok hab das Array geändert und jetzt funktioniert es :)

Darauf wär ich wohl nie gekommen^^


Riesen Dank,
MfG

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
M. D. schrieb:
> Wahnsinn wie schnell die Antworten kommen!
>
> Ok hab das Array geändert und jetzt funktioniert es :)
>
> Darauf wär ich wohl nie gekommen^^

Ich hoffe du hast deine Lektion gelernt:
"Schreib nie etwas hin, was dir der Compiler abnehmen kann."
Du machst nämlich Fehler, der Compiler nicht.

Autor: Skua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Du machst nämlich Fehler, der Compiler nicht.

Ich hab schon Compiler gesehen die Fehler machen, dann aber 
zuverlässiger als ich.
;-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch besser ist allerdings diese Lösung (sofern auf deinem µC es keine 
Probleme mit konstanten Strings gibt

void SendString( const char* string )
{
  while( *string ) {
    SBUF = *string;
    Warte10Us(200);
    string++;
  }
}

void funktion(int fall)
{
   switch( fall ) {
      case 2: //OK!
         SendString( "OK" );
         break;
 
      case 3: //Fehleingabe!
         SendString( "Fehleingabe!" );
         break;
     
      default: //Frequenz in Hz: 
         SendString( "Frequenz in Hz: " );
   }     
}

... und die Arrays haben sich in Luft aufgelöst (und die Kommentare 
braucht dann auch kein Mensch mehr, steht eh in der nächsten Zeile, 
worum es in diesem case geht)

Autor: M. D. (derdiek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das werd ich mal ausprobieren, das sieht auch wesentlich schöner aus 
wenn mans sich so anschaut.. Und der Code wird kompakter..

Danke ;)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Satz von Karl Heinz

> sofern auf deinem µC es keine
> Probleme mit konstanten Strings gibt

muss man aber berücksichtigen. Auf den beliebten AVRs gibt es genau 
diese Probleme - schreibt man das so, wie im Beispiel von Karl Heinz, 
dann landen die Stringkonstanten im RAM (natürlich auch im ROM, dort 
stehen die Daten, mit denen das RAM initalisiert wird).

Das liegt an der Harvard-Architektur der AVRs, die RAM und ROM in 
getrennten Adressräumen unterbringt. Näheres und auch Lösungen wirft die 
Forensuche aus, wenn Du nach "pgmspace.h" suchst.

Autor: Skua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein abschließendes \0x00 kann je nach Compiler auch nötig sein.

Autor: Na sowas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Skua schrieb:
> Ein abschließendes \0x00 kann je nach Compiler auch nötig sein.
Nicht wenn er Ansi kompatibel ist. Und wenn doch, dann würde ich den 
schnell wegwerfen, wer weiß was sonst noch für Bugs drin sind. Ein 
String ist in C implizit mit einer 0 abgeschlossen.

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.