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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von henni (Gast)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht lesenswert
henni schrieb:
> Sinn soll das haben?

eine ODER platzsparend bauen.

von g457 (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht lesenswert

von Nop (Gast)


Bewertung
0 lesenswert
nicht 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
    }

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.