Switch Case überspringt break;

OP #1903280
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):
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?
#1903288
Lesenswert?

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 #1903296
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
#1903314
Lesenswert?

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 #1903594
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.
Gast #1903660
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren