# Philosophiefrage: Break in C



## Tapio Bearking (10 Juli 2008)

Hallo Forum,

ich habe mal eine Philosophiefrage betreffend den Befehl "break" in C.

Zuerst, er ist möglich und auch definiert aber meines Erachtens nach, sollte man, wenn möglich diesen Befehl nicht verwenden, da es ein Sprung quer durch den Quellcode ist. Deswegen sollte man break nur in Verbindung mit switch/case verwenden.

Man kann Break also jederzeit benutzen um Schleifen zu verlassen, aber ich z.B. habe dabei die berühmt berüchtigten Bauchschmerzen das es irgendwann einmal schief geht.

Wie steht ihr zu dem Kommando break?

Nachtrag: Plattform auf dem das ganze laufen soll ist ein netX500


----------



## Ralle (10 Juli 2008)

Was hast du gegen break? Da wird nicht quer durch das Programm gesprungen, sondern:



> Diese Anweisung  ermöglicht den Abbruch von for, while, do ... while Zyklen sowie  switch Anweisungen. Das Programm wird mit der ersten Anweisung nach dem Zyklus bzw. der Fallauswahl fortgestetzt.



Das ist absolut nachvollziehbar und auch sinnvoll.

Nicht zu Verwechseln mit der berühmten GoTo-Anweisung aus Basic !


----------



## vierlagig (10 Juli 2008)

Ralle schrieb:


> Nicht zu Verwechseln mit der berühmten GoTo-Anweisung aus Basic !



auf GoTo laß ich nichts kommen!


----------



## Tapio Bearking (10 Juli 2008)

@Ralle: Ich hatte es anders gelernt und da waren break (außer im switch/case) und das goto (gibt es auch im C)  "No go"s. Wenn man darauf angwiesen ist, eine for Schleife vor ihrem eigentlichen Ende (Limit eines Zählers) zu verlassen, soll man die Schleife entsprechend aufbauen, nämlich mit einem do...while(condition).


----------



## Ralle (10 Juli 2008)

vierlagig schrieb:


> auf GoTo laß ich nichts kommen!



Ja, ja, da hätt ich mir auch denken können. Deshalb wirds aber nicht schöner !


----------



## Tapio Bearking (10 Juli 2008)

Gotos sind hier im Code auch massenweise verstreut *schauder*


----------



## vierlagig (10 Juli 2008)

Tapio Bearking schrieb:


> Gotos sind hier im Code auch massenweise verstreut *schauder*



ich wars nicht *pfeif*

also um nochmal zum break zu kommen ... wenn es ordentlich dokumentiert ist, ist es nachvollziehbar und damit geht keine gefahr mehr davon aus. eine vernünftige schleife natürlich, macht ein break überflüssig, aber das ist wie in allen programmiersprachen, man kann viele konstrukte durch andere ersetzen - muß man manchmal sogar um laufzeiten einhalten zu können oder den speicherkonventionen zu genügen


----------



## Tapio Bearking (10 Juli 2008)

vierlagig schrieb:


> ich wars nicht *pfeif*



Das würd ich jetzt an deiner Stelle auch behaupten. Wo warst du am 17.04.2001, Hm?
*Tischlampe einschaltet und auf Vierlagigs Gesicht richtet*


----------



## vierlagig (10 Juli 2008)

Tapio Bearking schrieb:


> Das würd ich jetzt an deiner Stelle auch behaupten. Wo warst du am 17.04.2001, Hm?
> *Tischlampe einschaltet und auf Vierlagigs Gesicht richtet*



da hab ich grad abi gemacht ... keine ahnung ... besoffen aufm "lern"-hügel?


----------



## Ralle (10 Juli 2008)

vierlagig schrieb:


> da hab ich grad abi gemacht ... keine ahnung ... besoffen aufm "lern"-hügel?



Ne, ne 4L, du hast doch nicht mal die HS geschafft *ROFL*!
Ich tippe auf Kindergarten "Große Gruppe".

Wieso break ordentlich dokumentieren? Ist doch eindeutig, was nach break passiert. Braucht man übrigens doch recht häufig, wenn man Listen oder Datenbanken schrittweise durchsucht und, nachdem man einen Treffer hat, die Suche abbrechen möchte.


----------



## vierlagig (10 Juli 2008)

Ralle schrieb:


> Wieso break ordentlich dokumentieren?


weil man grundsätzlich code ordentlich dokumentieren sollte! 



> Die *break* Anweisung steht irgendwo im Schleifenrumpf meist in Verbindung mit einer if Abfrage. Läuft das Programm in sie hinein, bricht sie die Schleife ab. Stößt man im bei der Abarbeitung der Schleife auf eine *break* Anweisung wird die Schleife ohne weiteres verlassen und das Programm danach vortgesetzt. Sinn der break Anweisung ist es also, die Schleife abzubrechen, wenn ein bestimmter Zustand eintritt, ohne eine Orgie von if ... else... Abfragen einbauen zu müssen.



ich find break nicht verwerflich PUNKT

achso: @ralle: ja nee, is klar biene!


----------



## Rainer Hönle (10 Juli 2008)

Auch ich finde break nicht nur nützlich sondern sinnvoll. Dies entspricht vom Prinzip her ja auch dem __leave in einem __try-block. Und dies sieht sogar mein Freund Bill gern ;-).


----------



## Cerberus (10 Juli 2008)

vierlagig schrieb:


> weil man grundsätzlich code ordentlich dokumentieren sollte!


 
Ach wie schön wäre es doch, wenn jeder sich daran halten würde. Dann wär es endlich mal ein kleines Paradies auf Erden.


Breaks finde ich eine nützliche Sache, um die man bei manchen Anwendungen gar nicht drum rum kommt.


----------



## HeizDuese (10 Juli 2008)

break ist ok, goto's sind bei einigen Leuten (zu denen ich mich auch zähle) absolut unbeliebt.


----------



## afk (10 Juli 2008)

vierlagig schrieb:


> weil man grundsätzlich code ordentlich dokumentieren sollte!


Mir ist selbsterklärender Code lieber als irgendwelche Wischi-Waschi-Kommentare, die nur deswegen hingeschrieben werden, weil halt Kommentare drin sein müssen. Eine vernunftige Namensgebung bei Funktionen, Typen, Variablen und Konstanten ist da oft wesentlich hilfreicher und leider wesentlich seltener, als manch nichtssagende Prosa in Kommentaren, die mehr verwirrend als erklärend wirken.

Was den break angeht, der ist nichts Negatives und IMHO mit einem goto absolut nicht zu vergleichen, sonst dürfte man in C-Funktionen den return auch nur noch als letzte Anweisung in einer Funktion zulassen, das wäre dann in etwa das Gleiche. Der break dient ja ganz einfach dazu, eine Schleife an einer beliebigen Position innerhalb der Schleife strukturiert zu verlassen, ist also eigentlich eine Erweiterung der "guten" Strukturelemente einer Hochsprache. Ohne Einsatz von break wäre oft viel unübersichtlicher Code notwendig, um das gleiche Ergebnis zu bekommen. 


Gruß aus Narvik
Axel


----------



## vierlagig (11 Juli 2008)

afk schrieb:


> Mir ist selbsterklärender Code lieber als irgendwelche Wischi-Waschi-Kommentare, die nur deswegen hingeschrieben werden, weil halt Kommentare drin sein müssen. Eine vernunftige Namensgebung bei Funktionen, Typen, Variablen und Konstanten ist da oft wesentlich hilfreicher und leider wesentlich seltener, als manch nichtssagende Prosa in Kommentaren, die mehr verwirrend als erklärend wirken.



na aber, wer wird denn hier über gute prosa schimpfen?
dass varibalen nach dem schema 'typ in einem buchstaben''NameMitFunktion' benannt werden ist doch wohl klar und das funktionen nicht "test" oder "xxx" heißen sollten, sondern ähnlichen konventionen, zumindest wenn man es gut machen will, wie die variablen unterliegen sollten auch jedem >pascal-programmierer bekannt sein ... und wenn man sich selberst dazu zwingt, dann kann man das ganze, mit der prosa(!) auch nach ein paar wochen noch verstehen  ... aber ich werde OT und ich habe in einem anderen beitrag von dir, es war sogar eine umfrage, glaub ich, heut gelesen, dass man dann ein neues thema erstellen soll ... das find ich in dem zusammenhang aber grad bestuhlt


----------



## Tapio Bearking (11 Juli 2008)

> Der break dient ja ganz einfach dazu, eine Schleife an einer beliebigen Position innerhalb der Schleife strukturiert zu verlassen


Eben genau das ist das Problem. Meiner (und scheinbar nur meiner, aber was soll's, ich war schon immer ein Einzelkämpfer) Meinung nach wird diese Struktur durch ein Break eben zerbrochen, zwar nicht sehr, aber sagen wir mal, sie hat einen Knacks, der eventuell weiter bricht.
Nehmen wir mal ein einfaches For(Start; _Abbruchbedingung_; xyz++); Wenn ich z.B. eine Schleife vorzeitig verlassen will, ist für ein break kein bedarf, da ich die Abbruchbedingung ja in dem Schleifenkopf, bzw. Schleifenende bei do/while() untergebracht habe.


----------



## argv_user (11 Juli 2008)

*Ich oute mich als Gerne-Breaker*

Wenn Du ein vorzeitiges Ende einer Schleife brauchst, kannst Du entweder ein Flag setzen und dieses als Abbruchbedingung nehmen, oder Du schreibst kurz "break".

Ob das break jetzt den Code unübersichtlich macht?


----------



## HeizDuese (11 Juli 2008)

Tapio Bearking schrieb:


> Eben genau das ist das Problem. Meiner (und scheinbar nur meiner, aber was soll's, ich war schon immer ein Einzelkämpfer) Meinung nach wird diese Struktur durch ein Break eben zerbrochen, zwar nicht sehr, aber sagen wir mal, sie hat einen Knacks, der eventuell weiter bricht.
> Nehmen wir mal ein einfaches For(Start; _Abbruchbedingung_; xyz++); Wenn ich z.B. eine Schleife vorzeitig verlassen will, ist für ein break kein bedarf, da ich die Abbruchbedingung ja in dem Schleifenkopf, bzw. Schleifenende bei do/while() untergebracht habe.



Irre ich, oder ist das, was hier als "_Abbruchbedingung_" im Schleifenkopf deklariert wurde nicht in Wirklichkeit die "_Schleifenausführbedingung_" ???


----------



## Tapio Bearking (11 Juli 2008)

Mir war das Wort entfallen. Kommt es nicht aber auf das selbe raus?


----------



## Cerberus (11 Juli 2008)

HeizDuese schrieb:


> Irre ich, oder ist das, was hier als "_Abbruchbedingung_" im Schleifenkopf deklariert wurde nicht in Wirklichkeit die "_Schleifenausführbedingung_" ???


 

Solange die mittlere Bedingung (hier: "_Abbruchbedingung_") erfüllt ist, wird die Schleife ausgeführt!


----------



## Rainer Hönle (11 Juli 2008)

Tapio Bearking schrieb:


> Eben genau das ist das Problem. Meiner (und scheinbar nur meiner, aber was soll's, ich war schon immer ein Einzelkämpfer) Meinung nach wird diese Struktur durch ein Break eben zerbrochen, zwar nicht sehr, aber sagen wir mal, sie hat einen Knacks, der eventuell weiter bricht.
> Nehmen wir mal ein einfaches For(Start; _Abbruchbedingung_; xyz++); Wenn ich z.B. eine Schleife vorzeitig verlassen will, ist für ein break kein bedarf, da ich die Abbruchbedingung ja in dem Schleifenkopf, bzw. Schleifenende bei do/while() untergebracht habe.



Das mag bei einfachen Abbruchkriterien gehen. Wenn aber innerhalb der Schleife auf mehrere Abbruchbedingungen geprüft werden soll, ist ein break sauberer und übersichtlicher als 10 verknüpfte Bedingungen innerhalb der for oder do Anweisung.


----------



## vierlagig (11 Juli 2008)

Cerberus schrieb:


> Solange die mittlere Bedingung (hier: "_Abbruchbedingung_") erfüllt ist, wird die Schleife ausgeführt!



vielen dank für diese wertvolle information!

ich bleib dabei, break macht sinn!


----------



## Simon_ (29 November 2012)

Bin gerade dabei eine Statusmaschine in ST zu programmieren. Um eine Echtzeitfähigkeit herzustellen muss der abzuarbeitende Code in jedem Zyklus ungefähr gleich lang sein, zumindest nicht in besonderen Fällen extrem lang sein. Ohne BREAK (ich kann es leider nicht im Sprachumfang von ST finden) habe ich das Problem, dass die Abarbeitung des INIT States und des darauf folgenden States entsprechend zu lange dauert. Der Sourcecode sollte sich auf zwei Zyklen verteilen. Momentan bekomme ich das nur hin, indem ich die Statusmaschine auf den Kopf stelle:

CASE iState OF
30:  // Aufräumen
20: // Abarbeiten
10: // Initalisieren
END_CASE

von daher würde für mich CASE sehr viel Sinn machen und zur Lesbarkeit des Codes beitragen


----------



## DaHauer (29 November 2012)

Hallo,

Also in ST gibt es für CASE Anweisungen kein Break im Sinne wie bei C. Solange du in deinem State iState nicht änderst, wird die SPS immer wieder in diesen State gehen. (so kenne ich das zumindest bei ST nach IEC61131)


eine Statemachine hat in ST in etwa so eine Struktur:


```
CASE iState OF

10:
(* do something here *)
iState := !! hier kommt jetzt der state rein, in den du als nächstes wechseln willst !!

20:
(* do something here *)
iState := !! hier kommt jetzt der state rein, in den du als nächstes wechseln willst !!


END_CASE
```

wenn du die Statemachine von oben weg durchlaufen willst, so musst du iState auch so setzten.

Was mir auch nicht ganz klar ist, was die Echtzeitfähigkeit mit deinem Code zu tun hat. Ich habe Statemachines mit höchst unterschiedlichem Inhalt in den einzelnen States und musste mich um die Einhaltung der Zykluszeit noch nie kümmern. (ausser du hast eine doch wirklich schwache CPU in deiner Steuerung)

Welche Steuerung setzt du denn ein?

cheers


----------

