# VB.NET - For-Schleife vorzeitig verlassen



## AlexTh (24 September 2019)

Hallo,

ich möchte in einer FOR-Schleife einen Vorgang wiederholen, bis eine Randbedingung erfüllt ist. Kann mir jemand sagen, wie man die Schleife richtig verlässt?

Nutze ich bei erfüllter Randbedingung Exit For oder setze ich den Zähler bei Erfüllung einfach auf die Anzahl der maximalen Wiederholungen?

Ich kann es momentan leider nicht testen, hat vielleicht jemand einen Beispielcode?


----------



## Heinileini (24 September 2019)

Beides ist möglich, aber das Manipulieren des SchleifenZählers wäre eher ein WorkAround, wenn es den Exit nicht gäbe.


----------



## Matze001 (24 September 2019)

Viele Wege führen nach Rom...

Mein Ansatz wäre so etwas (pseudocode):


```
int cnt_i = 0;
do

code();

cnt_i++;
until (bedingung OR cnt_i >= max_cnt)
```


oder:

```
For i=0, i > 20 Do

code();

if (abbruchbedingung())
{
exit;
}

endfor;
```


----------



## PN/DP (24 September 2019)

Viele Wege führen nach Rom...

Ich frage mich, warum das eine FOR-Schleife sein soll. Was soll da in der Schleife gezählt werden?
"wiederholen, bis eine Randbedingung erfüllt ist" ist für mich eigentlich eine einfache DO-LOOP-Schleife.
Ein Schleifenzähler für maximale Wiederholungen ist möglicherweise abhängig von der Prozessorgeschwindigkeit, da macht eigentlich nur ein AnzahlVersuche-/Warte-/Zeit-Zähler Sinn - das kann man aber auch einfach als DO-LOOP-Schleife formulieren und hat dann eine klare Wiederhol- oder Abbruchbedingung ohne zusätzliche "Notausgänge".

Im Umfeld von SPS werden FOR-Schleifen eher verwendet wenn man vorhat, alle Schleifendurchläufe auszuführen oder wenn man die Zählvariable als Array-Index verwenden will.

Die einfache DO-LOOP-Schleife hat im Idealfall an nur einer Stelle übersichtlich die Abbruchbedingungen.

```
AnzahlVersuche = 0
DO
  AnzahlVersuche += 1
  fertig = code()
LOOP UNTIL fertig OR AnzahlVersuche >= 10
```

Die FOR-Schleife hat den Vorteil, daß man die Zählvariable nur einmal hinschreiben muß - sich also weniger vertippen kann. Sie suggeriert mir aber, daß sie eher 10 mal als nur 1 mal durchlaufen wird. Vorzeitiges beenden/verlassen der Schleife muß extra formuliert werden.

```
FOR AnzahlVersuche = 1 TO 10
  fertig = code()
  IF fertig THEN
    EXIT FOR
  END IF
NEXT
```

Harald


----------



## GLT (25 September 2019)

AlexTh schrieb:


> ich möchte in einer FOR-Schleife einen Vorgang wiederholen, bis eine Randbedingung erfüllt ist


Immer dann, wenn man die Anforderung an eine Schleife genau so umgangsspranglich formulieren kann, ist die FOR/NEXT die falsche Schleife u. DO/LOOP die richtige.


----------



## holgermaik (25 September 2019)

```
DO/LOOP die richtige
```
aber den Notausgang über einen Schleifenzähler nicht vergessen. (wie PN/DP sein Beispiel). Sonst hat man ganz schnell eine Endlosschleife gebastelt


----------



## GLT (25 September 2019)

Errorhandling ist aber wieder ein eigenes Thema


----------



## Heinileini (25 September 2019)

GLT schrieb:


> Errorhandling ist aber wieder ein eigenes Thema


Aber damit kommt evtl. das vorzeitige Verlassen einer Schleife per EXIT wieder ins Spiel ... egal, ob FOR oder LOOP.


----------



## AlexTh (27 September 2019)

An DO-LOOP hatte ich ehrlich gesagt nicht gedacht, aber wenn man die Versuche zählt, dann wäre dies wirklich eine Möglichkeit.

Ich befinde mich geistig auf einer Sinumerik 840D mit Operate und muss mir dann erstmal anschauen, was die Steuerung alles hergibt bzw. wie die Befehle dort angewandt werden können.


----------

