mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik c switch break in Bedingung


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.
Autor: switchbreak (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Kann man in einer switch Struktur break in eine if-Bedingung setzen? 
Sieht etwas "komisch" aus und mag ungewöhnlich sein, aber geht das rein 
techisch?

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja kann man. Aber mann sollte es nicht mit allzu vielen 
Verschachtelungen übertreiben, da der Quelltext dabei schnell 
unübersichtlich wird.

Autor: switchbreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
> Ja kann man. Aber mann sollte es nicht mit allzu vielen
> Verschachtelungen übertreiben, da der Quelltext dabei schnell
> unübersichtlich wird.

Ja ich mach das ungern, aber es bietet sich aktuell an.
Danke für die schnelle Antwort.

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Absichtlich durchfallende cases sind immer mal wieder gut für ne 
temporäre Hirnverknotung beim Leser des Codes, ich würd noch nen knappen 
Kommentar dazu schreiben um sich prophylaktisch für die 
Unannehmlichkeiten zu entschuldigen und zu erklären warum das an der 
Stelle passieren muss. Abgesehen davon ist es OK.

: Bearbeitet durch User
Autor: Wegstaben V. (wegstabenverbuchsler)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
switchbreak schrieb:
> Kann man  ... aber geht das rein techisch?

was ist bei dir "rein technisch"? Syntax oder Semantik?

wenn die Syntax (die Grammatik) nicht stimmt, dann wird dich der 
Compiler drauf aufmerksam machen. Der Satz "Fahrrad Hund der das isst" 
ist z.B. syntaktisch fehlerhaft.

Wenn die Semantik (die Bedeutung) nicht stimmt, dann wirst du es am 
Ergebnis merken. Der Satz "Der Hund isst das Fahrrad" ist syntaktisch 
korrekt, aber die Semantik ist etwas seltsam

Autor: switchbreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd K. schrieb:
> temporäre Hirnverknotung

hab ich heute den ganzen Tag :) Daher ja die Frage
Vielleicht sollte ich mal Schluss machen.

So sieht das aus. HEUTE fällt mir nichts besseres ein.
     // SM: LED-Blinksequenz ausgeben
     switch (iErrStatus) {
       case 1:                                            // Aufruf via Timer
            if (IsZS(SM_BIT_TM))                          // Im Troublemodus keine Blinksequenz
               {break;}
       case 2:                                            // Manueller Aufruf
            DiISR();                                      // ISR sperren
            SM.ErrOutAktiv = 1;                           // Fehlerausgabe ist aktiv
            SM_PrintByte(iErrNr, 7, 2, ErrOutputReadyE);  // Fehler per Blinksequenz ausgeben
            EnISR();                                      // ISR erlauben
            break;
       default: /*nichts*/
            break;
     } // Ende LED-Blinksequenz ausgeben

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
switchbreak schrieb:
>> temporäre Hirnverknotung
>
> hab ich heute den ganzen Tag :)

Der Klassiker ist:
        case 1:
            if (IsZS(SM_BIT_TM))
                {break;}
            // fall thru
        case 2:

Echte Hirnverknotung: ;-)
        case 1:
            if (!IsZS(SM_BIT_TM)) {
                case 2:
                    ...
            }
            break:

: Bearbeitet durch User
Autor: switchbreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ A. K.
schreibs doch mal kürzer hin ^^

Autor: switchbreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Echte Hirnverknotung: ;-)
>
>         case 1:
>             if (!IsZS(SM_BIT_TM)) {
>                 case 2:
>                     ...
>             }
>             break:
> 

Jetzt hast du noch mal geändert.
Wenn ich bei Fsll 2 bin, höre ich freiwillig auf ;)

Autor: Peter D. (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht noch schöner:
        case 1:
            if (!IsZS(SM_BIT_TM)) {
                case 2:
                    ...
                break:
            }
        case 3:

Autor: switchbreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
for(byte n=0; n<10; n++) {
  if(n < 6) }; // Exit bei n=6

Autor: Marten Morten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd K. schrieb:
> Absichtlich durchfallende cases sind immer mal wieder gut für ne
> temporäre Hirnverknotung beim Leser des Codes, ich würd noch nen knappen
> Kommentar dazu schreiben

Ich würde vorschlagen einen der (pseudo) Standard-Marker dafür zu 
verwenden:

GCC Attribut:
__attribute__ ((fallthrough));

GCC und Clang Marker-Kommentar, eine Reihe von Schreibvariationen von 
Fall Through, wie:
// fall through
// FALLTHROUGH
// FALLTHRU 
// fall-through
- blöderweise noch von einer Compiler-Option abhängig.

C++17 Standard:
[[fallthrough]];

GCC C++ Erweiterung:
[[gnu::fallthrough]];

Welchen jetzt genau? Ach, das Schöne an Standards ist doch, dass es so 
viele davon gibt.

> sich prophylaktisch für die
> Unannehmlichkeiten zu entschuldigen und zu erklären warum das an der
> Stelle passieren muss.

Warum? Es gibt nur einen Grund: Damit der Code macht was er soll.

Autor: Random .. (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter D. schrieb:
        case 1:
            if (!IsZS(SM_BIT_TM)) {
                case 2:
                    ...
                break:
            }
        case 3:

Wer macht denn sowas?!? :-) :-) :-)

switch/case ohne break lässt sich auch sehr gut für loop unrolling mit 
dynamischer Schleifenlänge verwenden.

: Bearbeitet durch User
Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Einen Switch mit nur zwei relevanten Cases würde ich durch ein
If-Konstrukt ausdrücken. Dann entfällt in diesem Fall sogar eine
Verschachtelungsebene:
  if(iErrStatus==1 && !IsZS(SM_BIT_TM) || iErrStatus==2) {
    DiISR();
    SM.ErrOutAktiv = 1;
    SM_PrintByte(iErrNr, 7, 2, ErrOutputReadyE);
    EnISR();
  }

Autor: switchbreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yalu X. schrieb:
> Einen Switch mit nur zwei relevanten Cases würde ich durch ein
> If-Konstrukt ausdrücken.

Kommt drau an. Wenn man für ein Kunstmuseum programmiert , sieht deas 
doch auch schick aus
     switch (i) {
       case 1:                                            // Aufruf via Timer
       default:                                            // Manueller Aufruf
            if (1) {
               case 3:
               break;  
            }

            break;
     }


PS:

Autor: switchbreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich mach jetzt besser feierabend
ciao

Autor: A. S. (achs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
switchbreak schrieb:
>
> for(byte n=0; n<10; n++) {
>   if(n < 6) }; // Exit bei n=6
> 

Wieso ist das syntaktisch OK?

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. S. schrieb:
> Wieso ist das syntaktisch OK?

Für wen? Für einen C-Compiler jedenfalls nicht.

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stefan@stefanspc:~/Downloads$ cat test.c 
#define byte unsigned char

int main(int argc, char** argv)
{
    for(byte n=0; n<10; n++) 
    {
        if(n < 6) // Exit bei n=6
    };
}
stefan@stefanspc:~/Downloads$ gcc test.c
test.c: In function main:
test.c:8:5: error: expected expression before } token
     };
     ^


Was soll denn da den "Exit" bewirken? Vermutlich hast du ein "break;" 
vergessen und die Bedingung falsch geschrieben, richtig?
#define byte unsigned char

int main(int argc, char** argv)
{
    for(byte n=0; n<10; n++) 
    {
        if(n == 6) break; // Exit bei n=6
    };
}

So ist es compilierbar.

: Bearbeitet durch User
Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Random .. schrieb:
> Peter D. schrieb:        case 1:
>             if (!IsZS(SM_BIT_TM)) {
>                 case 2:
>                     ...
>                 break:
>             }
>         case 3:
>
> Wer macht denn sowas?!? :-) :-) :-)

z.B. der Herr Adam Dunkel mit seinen Protothreads.
https://de.wikipedia.org/wiki/Protothread
Und natürlich noch viele mehr. (z.B. meiner seiner)

: Bearbeitet durch User
Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arduino Fanboy D. schrieb:
> z.B. der Herr Adam Dunkel mit seinen Protothreads.

Oha, erinnere mich nicht daran. Ich brauchte Tage, bis ich verinnerlicht 
hatte, welche Folgen seine Protothreads und die darauf aufbauenden 
Protosockets für die Programmierung haben.

Auf den ersten Blick hat er sich da was ganz tolles ausgedacht, was den 
Code gut lesbar macht. Aber er hat dabei auch einen grossen Haufen neuer 
Fallstricke eingeführt.

Ich kann von Protothreads nur abraten. Meiner Meinung nach hat er damit 
die Programmiersprache missbraucht.

Für nicht eingeweihte gibt es hier eine kurze Beschreibung auf deutsch: 
http://stefanfrings.de/net_io/protosockets.html

: Bearbeitet durch User
Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier haben wir das schon diskutiert: 
Beitrag "Wer benutzt Protothreads?"

: Bearbeitet durch User
Autor: Peter D. (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
> Auf den ersten Blick hat er sich da was ganz tolles ausgedacht, was den
> Code gut lesbar macht.

Das stimmt. Damit kann besonders ein Anfänger sehr einfach Multitasking 
programmieren, was deutlich besser ist, als sich mit tausenden Delays 
die Echtzeit zu zerschießen. Die automatische Case-Generierung ist recht 
clever. Die Fallsticke halten sich im Rahmen bei kleinen Programmen.
In der 4ma wird man dafür natürlich gesteinigt.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
> Oha, erinnere mich nicht daran. Ich brauchte Tage, bis ich verinnerlicht
> hatte, welche Folgen seine Protothreads und die darauf aufbauenden
> Protosockets für die Programmierung haben.

Solche Methoden genialer Minimalistik funktionieren deutlich besser, 
wenn man sie sich selbst ausgedacht hat. ;-)

Autor: C ist einfach nur sch... (Gast)
Datum:

Bewertung
-4 lesenswert
nicht lesenswert
A. K. schrieb:
> case 1:
>             if (!IsZS(SM_BIT_TM)) {
>                 case 2:
>                     ...
>             }
>             break:

Markus F. schrieb:
> https://de.wikipedia.org/wiki/Duff%

hier wieder der Beweis, dass C einfach nur sch... ist.
Anstatt die Sprache zu verbessern, werden Krückenkonstrukte generiert 
und die Gemeinde geilt sich daran auf.

Sorry, geht gar nicht. :-<<<

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Man kann in jeder Programmiersprache Krückenkonstrukte bauen.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.

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