switch Anweisung default Zweig (Kompilerfehler?)

#1286354
Lesenswert?

Hallo Forum,
ich habe ein Problem mit folgender switch-case Anweisung:
1
switch (Befehl){
2
 case 'D' :                      
3
   uart_puts("ein D\r");
4
   break;
5
 case 'R' :                      
6
   uart_puts("ein R\r");
7
   break;
8
 case 'W' :
9
   uart_puts("ein W\r");
10
   break;
11
 case 'P' :                      
12
   uart_puts("ein P\r");
13
   break;
14
 default:
15
   uart_puts("nop\r");
16
   break;
17
}
In 'Befehl' steht ein Zeichen, welches ich über RS232 mit meinem 
ATMega88 empfange. Je nach empfangenem Zeichen wird eine Antwort über 
RS232 an den PC gesendet (mit der UART library von P. Fleury).
Das ganze funktioniert auch sehr gut.

Nun habe ich neu den default-Zweig eingefügt. Wenn jetzt ein ungueltiges 
Zeiche empfangen wird, soll ein 'nop' gesendet werden - funktioniert 
auch.

ABER: Wenn ein gültiges Zeichen empfangen wird (D, R, W oder P) wird 
neben dem zugehörigen Text auch immer noch das 'nop' aus dem default 
Zweig gesendet.
Nach meinem Verständnis soll der default Zweig aber nur durchlaufen 
werden, wenn keine andere Bedingung erfüllt ist, und nicht bei jeder 
richtigen UND falschen Bedingung.

Ist das ein Kompilerfehler oder habe ich einen Fehler zwischen den 
Ohren?
Wie erreiche ich, dass der default Zweig NUR bei ungültigen Zeichen 
durchlaufen wird?

P.S.
Ich verwende avr-gcc (WinAVR 20080610) 4.3.0
#1286379
Lesenswert?

Klaus schrieb:
> Oder ist es vielleicht doch einfach nur die Selbstüberschätzung der
> Anfänger, die immer zuerst dem Kompiler die Schuld geben?

Ich unterstelle niemandem in dem Bereich eine böse Absicht.
Es ist einfach der Lernprozess, dass unser vermeintlich gut 
funktionierendes Gehirn ganz schnell den Überblick über vermeintlich 
einfache Abläufe verliert.
#1286451
Lesenswert?

> Ich bin immer wieder erstaunt, das fast alle Kompilerfehler von
> Anfängern gefunden werden...
@Klaus
OK, ich bin nicht der Profi, und habe auch nicht wirklich an einen 
Kompilierfehler geglaubt. Die echten Fehler des Kompilers sind bestimmt 
nicht von so einfacher Natur. Darum auch das '?'. Dafür kann ich besser 
Minigolf ;-)

@Sven, K-H.
Richtig, ich sende nicht nur ein Zeichen sondern eine Zeichenkette mit 
abschießendem 'CR' (ist die Ende Kennung). Zusammen bis zu 4 Zeichen 
(das CR mitgezählt.
Die Routine wird eigentlich aber erst aufgerufen, wenn die Ende Kennung 
gefunden wurde (so hofft der Anfänger).
Ich werde eure Tipps mal verfolgen. Danke schon mal. Ist echt gut, dass 
einige von euch hier auf andere Bäume hinweisen, wenn mann den Wald 
nicht mehr sieht.... Wobei ich auch immer für eine spitzfindige 
Bemerkung offen bin.

MfG
Matthias
#1286458
Lesenswert?

Karl heinz Buchegger schrieb:
> Jede Wette du empfängst in Wirklichkeit nicht 1 Zeichen sondern 2. Zb
> ein abschliessendes Return nach dem Buchstaben.

Vor der Switch Anweisung kopiere ich mir das erste Zeichen des Strings 
in die Variable 'Befehl':
1
Befehl  = String[0]; // erstet Zeichen aus dem String holen
2
Parameter1 = String[1]; // zweites Zeichen aus dem String holen
3

4
switch (Befehl){
5
... siehe oben ...
6
}

der default Zweig wird aber wie beschrieben durchlaufen.

matsch
#1286468
Lesenswert?

Matthias R. schrieb:

> Ich werde eure Tipps mal verfolgen.

Der Haupttip ist immer:
Spick dein Programm mit Ausgaben. Wenn du nicht weißt, warum eine 
bestimmte Aktion ausgelöst wird, dann mach vor den entscheidenden if 
(oder in deinem Fall switch) eine Ausgabe rein, die dir den 
'Entscheidungsträger' anzeigt.

In deinem Fall hätte sich auch angeboten ...
1
 default:
2
   uart_putc("->'");
3
   uart_putc(Befehl);
4
   uart_putc("'"); 
5
   uart_puts("nop\r");
6
   break;

... damit du nicht nur siehst, dass etwas nicht verarbeitbares in den 
Verteiler gekommen ist, sondern auch noch siehst was das den war.
Bei einer 'Fehlermeldung' ist es immer gut, den Auslöser auch mit 
auszugeben. Die Anzahl der von Micorosoft mit der simplen Fehlermeldung 
in die Verzweiflung getriebenen Programmierer "Eine DLL konnte nicht 
gefunden werden" ist legendär  .... Verdammt - WELCHE?
#1286471
Lesenswert?

Matthias R. schrieb:

> der default Zweig wird aber wie beschrieben durchlaufen.

Der ganze switch-case wird dann aber wahrscheinlich in einer 
übergeordneten Schleifenstruktur ein zweites mal aufgerufen.

Mach mal folgendes:
1
switch (Befehl){
2
 case 'D' :                      
3
   uart_puts("ein D\r");
4
   break;
5
 case 'R' :                      
6
   uart_puts("ein R\r");
7
   break;
8
 case 'W' :
9
   uart_puts("ein W\r");
10
   break;
11
 case 'P' :                      
12
   uart_puts("ein P\r");
13
   break;
14
 default:
15
   uart_puts("nop\r");
16
   break;
17
}
18

19
uart_puts( "Fertig\r" );   // <-

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