Switch Case überspringt break;

OP #1903280
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):
1
void funktion(int)
2

3
int main(void)
4
{
5
   funktion(0)
6
   return 0;
7
} 
8

9
void funktion(int fall)
10
{
11
   int lauf, y=0;
12
   unsigned char aufforderung[16]="Frequenz in Hz: ";
13
   unsigned char bestaetigung[3]="OK";
14
   unsigned char fehleingabe[14]="Fehleingabe!";
15
   
16
   switch(fall)
17
      case 2: //OK!
18
         y=strlen(bestaetigung);
19
         for(lauf=0;lauf<=y;lauf++)
20
         {
21
            SBUF=bestaetigung[lauf];
22
            Warte10Us(200);
23
         }
24
         break;
25
     
26
      case 3: //Fehleingabe!
27
         y=strlen(fehleingabe);
28
         for(lauf=0;lauf<=y;lauf++)
29
         {
30
            SBUF=fehleingabe[lauf];
31
            Warte10Us(200);
32
         }
33
         break;
34
     
35
      default: //Frequenz in Hz: 
36
         y=strlen(aufforderung);
37
         for(lauf=0;lauf<=y;lauf++)
38
         {
39
            SBUF=aufforderung[lauf];
40
            Warte10Us(200);
41
         }
42
   }     
43
}

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?
Dein Problem hat nichts mit dem switch-case zu tun
1
  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!

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

oder noch besser
1
  const char * aufforderung = "Frequenz in Hz: ";
OP
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
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.
Noch besser ist allerdings diese Lösung (sofern auf deinem µC es keine 
Probleme mit konstanten Strings gibt
1
void SendString( const char* string )
2
{
3
  while( *string ) {
4
    SBUF = *string;
5
    Warte10Us(200);
6
    string++;
7
  }
8
}
9

10
void funktion(int fall)
11
{
12
   switch( fall ) {
13
      case 2: //OK!
14
         SendString( "OK" );
15
         break;
16
 
17
      case 3: //Fehleingabe!
18
         SendString( "Fehleingabe!" );
19
         break;
20
     
21
      default: //Frequenz in Hz: 
22
         SendString( "Frequenz in Hz: " );
23
   }     
24
}

... 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)
Persönliche Seite
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.
Gast
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.