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


von M. D. (derdiek)


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?

von Peter (Gast)


Lesenswert?

schreib mal bei default auch noch ein break hin.

von tek (Gast)


Lesenswert?

Fehlt da nicht noch ein
1
{
 nach Switch

von Markus -. (mrmccrash)


Lesenswert?

Nach dem switch() fehl ein { - falsch übernommen?

_.-=: MFG :=-._

von Karl H. (kbuchegg)


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: ";

von Oliver (Gast)


Lesenswert?

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

Hast du da mal nachgezählt?

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

von Sven H. (dsb_sven)


Lesenswert?

Peter schrieb:
> schreib mal bei default auch noch ein break hin.

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

von M. D. (derdiek)


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

von M. D. (derdiek)


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

von Karl H. (kbuchegg)


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.

von Skua (Gast)


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.
;-)

von Karl H. (kbuchegg)


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)

von M. D. (derdiek)


Lesenswert?

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

Danke ;)

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Skua (Gast)


Lesenswert?

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

von Na sowas (Gast)


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.

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.