switch case ohne break und Befehl, Programmablauf?

Gast #4792591
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
Gast
> 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.
Gast
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
    }

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.