Forum: Compiler & IDEs Switch-Variable innerhalb switch ändern


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,
ist es erlaubt, innerhalb eines switch-Statements die switch-Variable zu 
ändern? Konkret habe ich auf einem ATmega48 ein paar Zeilen, die jeweils 
nur einmal durchlaufen werden sollen (label tohigh und tolow):
1
void setup(void) {
2
  enum {tohigh,high,tolow,low,last} setup_mode = tohigh;  
3
4
  uint8_t shi = eeprom_read_byte(&eeServoHigh);     
5
  uint8_t slo = eeprom_read_byte(&eeServoLow);
6
  int8_t enc_this = encoder_get();
7
  int8_t enc_last = enc_this;
8
  uint8_t *enc_var =  &shi;  
9
  
10
  uint16_t kt = 0;
11
  
12
  while(1) {
13
    // Tastendruck interpretieren: Ausgang oder weiterschalten
14
    kt = key_time();
15
    if(kt) {
16
      if (kt > SHORT_LONG) {
17
        break;
18
      } else {
19
        setup_mode++;
20
        if (setup_mode==last) setup_mode = 0;
21
      }        
22
    } // if(kt)    
23
    
24
     // Drehgeber auswerten (nur Aenderungen)
25
     enc_this = encoder_get();
26
     *enc_var += enc_this-enc_last;
27
     enc_last = enc_this;    
28
    
29
    switch (setup_mode) {
30
      tohigh: // High-Stellung einstellen (Start)
31
        led_mpx_putany((char[]) {0x00,LED_CHAR_I,LED_CHAR_H});
32
        enc_this = encoder_get();
33
        enc_last = enc_this;
34
        enc_var = &shi;
35
        setup_mode = high;
36
        /* FALLTHRU */
37
      high: // High-Stellung einstellen 
38
        OCR1A = shi;
39
        break;
40
        
41
      tolow: // Low-Stellung einstellen (Start)
42
        led_mpx_putany((char[]) {0x00,LED_CHAR_O,LED_CHAR_L});
43
        enc_this = encoder_get();
44
        enc_last = enc_this;
45
        enc_var = &slo;
46
        setup_mode = low;
47
        /* FALLTHRU */
48
      low: // Low-Stellung einstellen
49
        OCR1A = slo;
50
    }
51
  } // while(1)
52
  
53
  eeprom_write_byte(&eeServoHigh, shi);
54
  eeprom_write_byte(&eeServoLow, slo);
55
}
das beobachtete Verhalten weicht jedoch massiv davon ab, was ich 
erreichen will (um genau zu sein: Er hängt sich beim Start der Routine 
auf).

Die Routine led_mpx_putany((char[]) ) stellt beliebige Bitmuster auf 
einer 3-Ziffern-7-Segment-Anzeige dar, die Funktion encoder_get(void) 
liest einen Drehgeber kontinuierlich aus und der Rest sind 
Standardfunktionen.

Die folgenden Warnungen des build-Prozesses machen mich mißstrauisch:
enumeration value 'tohigh' not handled in switch [-Wswitch]
enumeration value 'high' not handled in switch [-Wswitch]
enumeration value 'tolow' not handled in switch [-Wswitch]
enumeration value 'low' not handled in switch [-Wswitch]
enumeration value 'last' not handled in switch [-Wswitch]
label 'low' defined but not used [-Wunused-label]
label 'tolow' defined but not used [-Wunused-label]
label 'high' defined but not used [-Wunused-label]
label 'tohigh' defined but not used [-Wunused-label]

Viele Grüße
Nicolas

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Nicolas S. schrieb:
> ist es erlaubt, innerhalb eines switch-Statements die switch-Variable zu
> ändern

Ja, wieso nicht?

Nicolas S. schrieb:
> Er hängt sich beim Start der Routine auf

Was bedeutet das? Neustart? Endlosschleife?

Nicolas S. schrieb:
> as beobachtete Verhalten weicht jedoch massiv davon ab, was ich
> erreichen will

Ein case vor dem enum solltest du noch spendieren, siehe z.B. 
http://crasseux.com/books/ctutorial/enum.html

Nicolas S. schrieb:
> Die Routine [...] die Funktion [...]

Beim debugging immer auf das Wesentliche reduzieren... eine LED an/aus 
reicht oft völlig aus um das Problem einzugrenzen.

von Walter T. (nicolas)


Lesenswert?

Läubi .. schrieb:
> Ein case vor dem enum solltest du noch spendieren

Facepalm JA! Danke!

von Peter D. (peda)


Lesenswert?

Nicolas S. schrieb:
> ist es erlaubt, innerhalb eines switch-Statements die switch-Variable zu
> ändern?

Ein Switch ist ein indiziertes Goto, die Case sind die Labels.
Du kannst also die Variable jederzeit ändern, evaluiert wird sie nur in 
der Switch-Zeile.

von Walter T. (nicolas)


Lesenswert?

Peter Dannegger schrieb:
> Ein Switch ist ein indiziertes Goto

Wie Du siehst, hatte ich schon zuviel GOTO im Kopf. :)

Danke für die Klarstellung!

P.S.: Jetzt geht auch alles. Habe also bald auch wieder ein Foto für den 
Thread über krumme Tischplatten.

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.