KlassenKlassenKlassenKlassen | | | | Operatoren

Seite in aktueller Syntax (Programmiersprache) nicht vorhanden.

Seite in aktueller Syntax (Programmiersprache) nicht vorhanden.

Seite in aktueller Syntax (Programmiersprache) nicht vorhanden.

Seite in aktueller Syntax (Programmiersprache) nicht vorhanden.

Seite in aktueller Syntax (Programmiersprache) nicht vorhanden.

forforForforForFor (Operator)

Name

forforForforForFor — Eröffnet einen Schleifenblock, der i.d.R. mit einer festen Anzahl an Durchläufen ausgeführt wird.

Signatur

for( : : Start, End, Step : Index)

Herror for(const Hlong Start, const Hlong End, const Hlong Step, Hlong* Index)

Herror T_for(const Htuple Start, const Htuple End, const Htuple Step, Htuple* Index)

Herror for(const HTuple& Start, const HTuple& End, const HTuple& Step, Hlong* Index)

void For(const HTuple& Start, const HTuple& End, const HTuple& Step, HTuple* Index)

void HOperatorSetX.For(
[in] VARIANT Start, [in] VARIANT End, [in] VARIANT Step, [out] VARIANT* Index)

static void HOperatorSet.For(HTuple start, HTuple end, HTuple step, out HTuple index)

Beschreibung

Schreibweise in HDevelop: for Index := Start to End by Step

forforForforForFor eröffnet einen Schleifenblock, der i.d.R. mit einer festen Anzahl an Durchläufen ausgeführt wird. Der forforForforForFor-Block erstreckt sich bis zur zugehörigen endforendforEndforendforEndforEndfor-Anweisung.

Die Anzahl der Durchläufe wird durch die Werte für StartStartStartStartStartstart, EndEndEndEndEndend und die Schrittweite StepStepStepStepStepstep festgelegt. Diese Parameter können neben konstanten Werten auch durch Ausdrücke oder Variablen initialisiert werden. Es ist zu beachten, dass die Schleifenparameter nur am Anfang, beim Betreten der forforForforForFor-Schleife ausgewertet werden. Innerhalb der forforForforForFor-Schleife haben Änderung an den Variablen, die zur Initialisierung der Schleife verwendet wurden keinen Einfluss auf die Anzahl an Durchläufen.

Die übergebenen Schleifenparameter müssen vom Typ integer oder real sein. Sind alle Eingabevariablen vom Typ integer, so ist die Variable IndexIndexIndexIndexIndexindex ebenfalls vom Typ integer. In allen anderen Fällen ist die Variable IndexIndexIndexIndexIndexindex vom Typ real.

Vor jedem Schleifendurchlauf wird der Wert der Laufvariablen IndexIndexIndexIndexIndexindex mit dem Endwert verglichen. Ist -- bei einer positiven Schrittweite -- der Wert größer als der (bei der Initialisierung gesetzte) Endwert, wird die forforForforForFor-Schleife beendet und das Programm hinter der korrespondierenden endforendforEndforendforEndforEndfor-Anweisung fortgesetzt. Bei einer negativen Schrittweite muss die IndexIndexIndexIndexIndexindex-Variable kleiner als der Endwert sein, damit die Schleife abgebrochen wird.

Achtung: Ist die Schrittweite vom Typ real kann es passieren, dass -- wenn auf Gleichheit zwischen Laufvariable und Endwert getestet wird -- der letzte Schleifendurchlauf aufgrund von Rundungsfehlern nicht mehr ausgeführt wird. So wird auf manchen Systemen die folgende Schleife nicht wie erwartet vier mal durchlaufen (mit den Werten 1.3, 1.4, 1.5 und 1.6), sondern nur drei mal, da die Indexvariable nach drei Additionen mit 0.1 etwas größer als 1.6 ist:

  I:=[]
  for Index := 1.3 to 1.6 by 0.1
    I := [I,Index]
  endfor

Nach dem Abarbeiten der Anweisungen des Schleifenkörpers, d.h. nach dem Erreichen der korrespondierenden endforendforEndforendforEndforEndfor-Anweisung oder einer continuecontinueContinuecontinueContinueContinue-Anweisung, wird die (bei der Initialisierung gesetzte) Schrittweite auf den aktuellen Wert der IndexIndexIndexIndexIndexindex-Variable aufaddiert, und die Schleifenbedingung wie oben beschrieben erneut ausgewertet. Das Ergebnis der Auswertung bestimmt, ob die Schleife durch einen Sprung auf die erste Anweisung des Schleifenkörpers erneut ausgeführt wird, oder ob die Schleife durch einen Sprung auf die erste Anweisung hinter der korrespondierenden endforendforEndforendforEndforEndfor-Anweisung beendet wird.

Der Aufruf einer breakbreakBreakbreakBreakBreak-Anweisung innerhalb des Schleifenkörpers bewirkt das sofortige Verlassen der forforForforForFor-Schleife. Das Programm wird hinter der korrespondierenden endforendforEndforendforEndforEndfor-Anweisung fortgesetzt. Eine continuecontinueContinuecontinueContinueContinue-Anweisung dagegen führt dazu, dass der Rest des Schleifenkörpers ignoriert wird und das Program direkt mit dem Anpassen der Laufvariablen und der Auswertung der Schleifenbedingung fortgesetzt wrid.

Achtung: Das Verhalten bezüglich der IndexIndexIndexIndexIndexindex-Variable hat sich mit HALCON 11 geändert: In älteren Versionen wurden Änderungen an der IndexIndexIndexIndexIndexindex-Variable innerhalb des Schleifenkörpers von der forforForforForFor-Anweisung ignoriert. Dafür wurde die IndexIndexIndexIndexIndexindex-Variable von der forforForforForFor-Anweisung vor dem Auswerten der Schleifenbedingung auf einen internen Iterationswert zurückgesetzt. Dieser wurde entsprechend der folgenden Formel bestimmt:

  Index := Start + count * Step
wobei count die Anzahl der bereits absolvierten Schleifendurchläufe ist.

Damit Programme und Prozeduren, die mit einer älteren HALCON-Version (vor HALCON 11) erstellt und in einer neueren HALCON-Version geladen wurden, nicht automatisch ihr Verhalten ändern, werden beim Laden von älteren Programmen die forforForforForFor-Schleifen analysiert. Wird festgestellt, dass im Schleifenkörper die IndexIndexIndexIndexIndexindex-Variable modifiziert wird, wird die forforForforForFor-Anweisung in einen Kompatibilitätsmodus versetzt und entsprechend markiert. Eine so markierte forforForforForFor-Schleife wird entsprechend der alten Semantik ausgeführt und im Listing mit einem Warndreieck und dem Zusatz __use_internal_index__ am Zeilenende versehen. Im Operatorfenster erscheint ebenfalls eine Warnung und eine Checkbox, die es erlaubt, den Kompatibilitätsmodus für die forforForforForFor-Schleife aufzuheben und die Schleife entsprechend der neuen Semantik auszuführen. Im Freitexteditor kann das Gleiche durch Löschen des Zusatzes __use_internal_index__ erreicht werden. Damit sich das Programm danach nicht anders verhält als vorher, ist es allerdings notwendig, auch den Schleifenkörper so zu modifizieren, dass innerhalb der Schleife nicht mehr die Laufvariable verändert wird, sondern mit einer lokalen Kopie von dieser gearbeitet wird.

Es wird in jedem Fall empfohlen, darauf zu verzichten, die Laufvariable innerhalb der Schleife zu verändern, da dadurch zum einen der Programmcode schwieriger verständlich wird, und zum anderen ein solches Programm sich auf älteren HALCON-Versionen anders verhalten würde.

Wird die forforForforForFor-Schleife durch eine stopstopStopstopStopStop-Anweisung oder durch Drücken des Knopfes Stop angehalten und die Ausführungsmarke manuell umgesetzt, so wird die forforForforForFor-Schleife in der aktuellen Iteration fortgeführt, solange die Ausführungsmarke nur innerhalb der forforForforForFor-Schleife oder auf die endforendforEndforendforEndforEndfor-Anweisung gesetzt wird. Wird die Ausführungsmarke auf oder vor die forforForforForFor-Anweisung gesetzt und die Ausführung fortgesetzt, so wird die Schleife neu initialisiert und erneut komplett durchlaufen.

Parameter

StartStartStartStartStartstart (input_control)  number HTupleHTupleHTupleVARIANTHtuple (integer / real) (int / long / double) (Hlong / double) (Hlong / double) (Hlong / double) (Hlong / double)

Startwert des Schleifenzählers.

Defaultwert: 1

EndEndEndEndEndend (input_control)  number HTupleHTupleHTupleVARIANTHtuple (integer / real) (int / long / double) (Hlong / double) (Hlong / double) (Hlong / double) (Hlong / double)

Endwert des Schleifenzählers.

Defaultwert: 5

StepStepStepStepStepstep (input_control)  number HTupleHTupleHTupleVARIANTHtuple (integer / real) (int / long / double) (Hlong / double) (Hlong / double) (Hlong / double) (Hlong / double)

Änderung bei jedem Schleifendurchgang

Defaultwert: 1

IndexIndexIndexIndexIndexindex (output_control)  number HTupleHTupleHTupleVARIANTHtuple (integer / real) (int / long / double) (Hlong / double) (Hlong / double) (Hlong / double) (Hlong / double)

Laufvariable.

Beispiel (HDevelop)

read_image (Image, 'fabrik')
threshold (Image, Region, 128, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150, 99999)
area_center (SelectedRegions, Area, Row, Column)
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
dev_display (Image)
dev_display (SelectedRegions)
dev_set_color ('white')
for Index := 0 to |Area| - 1 by 1
  set_tposition (WindowHandle, Row[Index], Column[Index])
  write_string (WindowHandle, 'Area=' + Area[Index])
endfor

Ergebnis

Sind die Parameterwerte korrekt, dann liefert forforForforForFor (als Operator) den Wert 2 (H_MSG_TRUE). Andernfalls wird eine Fehlerbehandlung durchgeführt und ein Fehlercode zurückgeliefert.

Alternativen

whilewhileWhilewhileWhileWhile, untiluntilUntiluntilUntilUntil

Siehe auch

repeatrepeatRepeatrepeatRepeatRepeat, breakbreakBreakbreakBreakBreak, continuecontinueContinuecontinueContinueContinue, endforendforEndforendforEndforEndfor

Modul

Foundation


KlassenKlassenKlassenKlassen | | | | Operatoren