For Each Column…End-Anweisung (FPScript)
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