Forum: Mikrocontroller und Digitale Elektronik switch case ohne break und Befehl, Programmablauf?


von henni (Gast)


Lesenswert?

Hallo,

ich habe folgendes gegeben:
1
switch (config.ctrl_type) {
2
    case PPM_CTRL_TYPE_CURRENT_NOREV:
3
    case PPM_CTRL_TYPE_DUTY_NOREV:
4
    case PPM_CTRL_TYPE_PID_NOREV:
5
      servo_val += 1.0;
6
      servo_val /= 2.0;
7
      break;
8
9
    default:
10
      break;
11
    }


Wann wird nun was ausgeführt?

Und warum fehlt "break" zwischen den einzelnen case-Anweisungen? Welchen 
Sinn soll das haben?



mfg

von ms (Gast)


Lesenswert?

Hallo Henni,

henni schrieb:
> case PPM_CTRL_TYPE_CURRENT_NOREV:
>     case PPM_CTRL_TYPE_DUTY_NOREV:
>     case PPM_CTRL_TYPE_PID_NOREV:

das ist eine ODER Verknüfung.

ms

von Peter II (Gast)


Lesenswert?

henni schrieb:
> Sinn soll das haben?

eine ODER platzsparend bauen.

von g457 (Gast)


Lesenswert?

> Wann wird nun was ausgeführt?

Das hängt von config.ctrl_type ab.

> Welchen Sinn soll das haben?

Duplicate code vermeiden, Struktur und Übersichtlichkeit verbessern.

von (prx) A. K. (prx)


Lesenswert?


von Nop (Gast)


Lesenswert?

henni schrieb:
> Wann wird nun was ausgeführt?

Wenn config.ctrl_type eines der folgenden ist: case 
PPM_CTRL_TYPE_CURRENT_NOREV oder PPM_CTRL_TYPE_DUTY_NOREV oder 
PPM_CTRL_TYPE_PID_NOREV, dann wird das hier ausgeführt:

servo_val += 1.0;
servo_val /= 2.0;

das ist äquivalent zu folgendem Code:
1
if ((config.ctrl_type == PPM_CTRL_TYPE_CURRENT_NOREV) ||
2
    (config.ctrl_type == PPM_CTRL_TYPE_DUTY_NOREV) ||
3
    (config.ctrl_type == PPM_CTRL_TYPE_PID_NOREV))
4
{
5
      servo_val += 1.0;
6
      servo_val /= 2.0;
7
}

Ist config.ctrl_type keines der drei oben genannten, wird nichts 
gemacht.

> Und warum fehlt "break" zwischen den einzelnen case-Anweisungen? Welchen
> Sinn soll das haben?

Eben daß der Programmablauf hindurchfallen kann. Das macht man bei 
Statemachines ganz gerne, wenn mehrere Zustände dieselben Befehle 
teilen. Typischerweise hätte man dann z.B. nach case 
PPM_CTRL_TYPE_CURRENT_NOREV noch ein paar Befehle, dann kein break, und 
dann fällt man auf die gemeinsamen weiteren Befehle der Zustände.

Etwa sowas hier:
1
switch (config.ctrl_type) {
2
    case PPM_CTRL_TYPE_CURRENT_NOREV:
3
      something_special_current();
4
    case PPM_CTRL_TYPE_DUTY_NOREV:
5
      something_special_current_and_duty();
6
    case PPM_CTRL_TYPE_PID_NOREV:
7
      something_for_current_and_duty_and_pid();
8
      break;
9
10
    default:
11
      break;
12
    }

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.