For Each Column…End Statement (FPScript)
Répète une série d'instructions pour toutes les séries de données, c'est-à-dire les colonnes, dans une matrice de données ou tous les signaux dans une série de signaux.
Syntaxe
[Parallel] For Each Column Counter In Data Set Do
[Statements]
End
La syntaxe de l'instruction For Each Column...End se compose des éléments suivants :
Élément |
Description |
---|---|
Compteur |
Variable qui est utilisée comme compteur de boucle. Il n'est pas nécessaire de déclarer le compteur de boucle avec Dim. |
DataSet |
Une matrice de données ou une série de signaux avec les séries de données ou les signaux à itérer. |
Déclarations |
Une ou plusieurs instructions qui sont exécutées pour chaque série de données dans DataSet. |
Remarques
Le bloc For Each Column est exécuté s'il y a au moins une série de données dans Données. Dans ce cas, le programme exécute toutes les instructions de la boucle avec Counter égal à zéro. La boucle est répétée pour toutes les colonnes du Data Set, où Counter adopte les valeurs de zéro jusqu'au nombre de colonnes moins un. Le programme quitte alors la boucle et poursuit l'exécution avec l'instruction qui suit l'instruction End.
Vous pouvez modifier la valeur de Counter à l'intérieur d'une boucle, mais cela rend la compréhension et les tests du code plus difficiles.
Lecompteur est fréquemment utilisé dans la boucle pour indexer une série de données de la matrice de données ou un signal d'une série de signaux.
Vous pouvez imbriquer les boucles For...End en positionnant, par exemple, une boucle For Each Row..End à l'intérieur d'une boucle For Each Column..End. Pour chaque boucle, utilisez un nom de variable unique comme Counter.
Si vous ajoutez le mot clé Parallel, le nombre d'itérations dans FlexPro Professional et Developer Suite s'effectuera de manière simultanée et non consécutive. FlexPro allouera ensuite l'exécution au plus grand nombre de threads simultanés en fonction du nombre de cœurs de processeur disponibles. Il en résulte une multiplication correspondante de la vitesse de traitement, pour autant qu'elle ne soit pas limitée par d'autres facteurs tels que le rechargement de grands ensembles de données à partir du disque dur.
Veuillez noter qu'il y a certaines conséquences lors de l'exécution simultanée :
•Pour le compteur de boucle et la variable locale, que vous déclarez à l'intérieur du bloc Parallel For Each Column, une instance indépendante est créée pour chaque thread. L'accès à ce type de variable depuis l'extérieur du bloc n'est pas autorisé.
•Une variable locale que vous déclarez au-dessus du bloc Parallel For Each Column est utilisée conjointement par tous les threads. Si vous sélectionnez l'accès en écriture à ce type de variable dans le bloc, sa valeur sera immédiatement modifiée pour tous les autres threads également.
•L'ordre du nombre d'itérations étant indéfini, des concepts tels que la collecte de résultats individuels ne peuvent être utilisés avec l'opérateur de regroupement. Il est préférable de dimensionner suffisamment le résultat avant la boucle, puis de saisir les résultats individuels à l'aide de l'affectation indexée.
•L'instruction Break n'est pas autorisée dans une boucle parallèle.
Remarque : Dans la mesure du possible, vous devez éviter les boucles sur les valeurs individuelles d'un ensemble de données. FPScript vous permet de calculer des ensembles de données complets en une seule instruction. Les boucles peuvent généralement être remplacées par des fonctions pour l'isolation d'événements en conjonction avec l'opérateur Opérateur d'indexation. For Each Value...End est la boucle FPScript la plus rapide.
Disponible dans
FlexPro View, Basic, Professional, Developer Suite
Exemple
L'exemple suivant calcule la surface sous la courbe pour chaque signal d'une série de signaux et renvoie le résultat sous forme de série de données :
Arguments SignalSeries
Dim Résultat
Pour chaque colonne i dans SignalSeries Faire
Résultat := Integral(SignalSeries).Y[-1n]
End
Résultat
Pendant l'exécution parallèle de la boucle, au lieu d'utiliser l'opérateur de concaténation, il faut utiliser une affectation indexée :
Arguments SignalSeries
Dim Résultat = 0. # Nombre de colonnes (SignalSeries)
Parallel For Each Column i In SignalSeries Do
Résultat = Integral(SignalSeries).Y[-1n]
End
Résultat
Voir aussi
For Each Element...End Statement