For Each Column…End-Anweisung (FPScript)

09.03.2021

Wiederholt eine Reihe von Anweisungen für alle Datenreihen, d. h. Spalten, einer Datenmatrix bzw. alle Signale einer Signalreihe.

Syntax

[Parallel] For Each Column Zähler In Datensatz Do

   [Anweisungen]

End

Die Syntax der For Each Column...End-Anweisung besteht aus folgenden Teilen:

Teil

Beschreibung

Zähler

Variable, die als Schleifenzähler verwendet wird. Den Schleifenzähler müssen Sie nicht mit Dim deklarieren.

Datensatz

Eine Datenmatrix bzw. eine Signalreihe mit den zu iterierenden Datenreihen bzw. Signalen.

Anweisungen

Eine oder mehrere Anweisungen, die für jede Datenreihe in Datensatz ausgeführt werden.

Anmerkungen

Der For Each Column-Block wird ausgeführt, wenn sich mindestens eine Datenreihe in Datensatz befindet. In diesem Fall führt das Programm alle Anweisungen in der Schleife mit Zähler gleich Null aus. Die Schleife wird für alle Spalten in Datensatz wiederholt, wobei Zähler die Werte von Null bis zur Anzahl der Spalten minus Eins annimmt. Dann verlässt das Programm die Schleife und setzt die Ausführung mit der Anweisung fort, die auf die End-Anweisung folgt.

Sie können den Wert von Zähler zwar innerhalb einer Schleife ändern, dies erschwert jedoch das Verständnis und das Testen des Codes.

Zähler wird innerhalb der Schleife häufig zum Indizieren einer Datenreihe aus der Datenmatrix bzw. eines Signals aus der Signalreihe verwendet.

Sie können For...End-Schleifen verschachteln, indem Sie z. B. eine For Each Row..End-Schleife innerhalb einer For Each Column..End-Schleife positionieren. Verwenden Sie für jede Schleife einen eindeutigen Variablennamen als Zähler.

Wenn Sie das Schlüsselwort Parallel voranstellen, werden in den Editionen Professional und Developer Suite von FlexPro die Schleifendurchläufe nicht nacheinander sondern gleichzeitig durchgeführt. FlexPro verteilt die Ausführung dann auf maximal so viele gleichzeitig ablaufende Threads, wie Prozessorkerne vorhanden sind. Dies führt zu einer entsprechenden Vervielfachung der Verarbeitungsgeschwindigkeit solange diese nicht durch andere Faktoren, wie z. B. das Nachladen großer Datensätze von der Festplatte, beschränkt wird.

Die parallele Ausführung hat einige Konsequenzen, die Sie beachten müssen:

Für den Schleifenzähler und für lokale Variable, die Sie innerhalb des Parallel For Each Column-Blocks deklarieren, wird für jeden Thread eine unabhängige Instanz angelegt. Zugriff auf eine solche Variable von außerhalb des Blocks ist nicht zulässig.

Eine lokale Variable, die Sie oberhalb des Parallel For Each Column-Blocks deklarieren, wird von allen Threads gemeinsam genutzt. Wenn Sie innerhalb des Blocks schreibend auf eine solche Variable zugreifen, ändert sich deren Wert abrupt auch für die anderen Threads.

Da die Reihenfolge der Schleifendurchläufe unbestimmt ist, können Konzepte wie das Aufsammeln von Einzelergebnissen mit dem Bündelungs-Operator nicht verwendet werden. Stattdessen sollten Sie das Ergebnis vor der Schleife ausreichend dimensionieren und dann mittels indizierter Zuweisung die Einzelergebnisse eintragen.

In einer parallelen Schleife ist die Break-Anweisung nicht zulässig.

Hinweis   Sie sollten Schleifen über einzelne Werte eines Datensatzes nach Möglichkeit vermeiden. FPScript bietet Ihnen die Möglichkeit, komplette Datensätze in einer einzigen Anweisung zu verrechnen. Schleifen lassen sich meistens durch Funktionen zur Ereignisisolation in Verbindung mit dem Index-Operator ersetzen. Die For Each Value...End-Schleife ist die schnellste FPScript-Schleife.

Verfügbarkeit

FlexPro View, Basic, Professional, Developer Suite

Beispiel

Das folgende Beispiel berechnet die Fläche unter der Kurve für jedes Signal in einer Signalreihe und übergibt das Ergebnis als Datenreihe:

Arguments SignalSeries

Dim Result

For Each Column i In SignalSeries Do

    Result := Integral(SignalSeries).Y[-1n]

End

Result

Bei paralleler Ausführung der Schleife muss statt dem Verkettungsoperator eine indizierte Zuweisung verwendet werden:

Arguments SignalSeries

Dim Result = 0. # NumberOfColumns(SignalSeries)

Parallel For Each Column i In SignalSeries Do

    Result = Integral(SignalSeries).Y[-1n]

End

Result

Siehe auch

For Each Element...End-Anweisung

For Each Row...End-Anweisung

For Each Value...End-Anweisung

For...End-Anweisung

While...End-Anweisung

Do...While-Anweisung

Artikel teilen oder als Email versenden:

Diese Beiträge könnten Sie ebenfalls interessieren