Simscript III/Dictionnaire des instructions/ROUTINE
L’énoncé routine marque le début d’un sous-programme de type routine.
Syntaxe : |
|
où Nom_Routine est un nom apparaissant dans un define ... routine du preamble, E1, ..., En est une liste de paramètres d’entrée et S1, ..., Sm est une liste de paramètres de sortie.
Dans l’exemple qui suit, une routine effectuant la somme des éléments de deux matrices, et retournant la matrice résultante peut être implantée de deux façons différentes. Étant que les tableaux en paramètres sont passés par adresse, la matrice résultante c peut être déclarée en paramètre d’entrée (routine additionner_Matrices), et le sous-programme modifie les éléments de la matrice c en place. Une autre alternative (routine additionner_Matrices2) est de déclarer la matrice résultante en paramètre de sortie, l’allocation de la mémoire de la matrice résultante (reserve) doit être effectuée dans la routine, et le pointeur (passage de paramètre par adresse) à la matrice résultante est retourné au code appelant.
Exemple :
‘‘---------------------------------------------------------
routine additionner_Matrices ( a, b, c)
define a, b, c as 2-dimensional real arrays
define i, j as integer variables
for i = 1 to dim.f(a(*, *)),
for j = 1 to dim.f(a(i, *)),
let c(i, j) = a(i, j) + b(i, j);
return;
end ‘‘ additionner_Matrices
‘‘---------------------------------------------------------
routine additionner_Matrices2 given a, b yielding c
define a, b, c as 2-dimensional real arrays
define i, j as integer variables
define n_rows, n_cols as integer variables
let n_rows = dim.f(a(*, *))
let n_cols = dim.f(a(1, *))
reserve c(*, *) as n_rows by n_cols
for i = 1 to dim.f(a(*, *))
for j = 1 to dim.f(a(i, *))
let c(i, j) = a(i, j) + b(i, j);
return ;
end ‘‘ additionner_Matrices2
Et le code appelant est :
define x_mat, y_mat, z_mat as 2-dim real arrays
define m = 4 as constant ;
reserve x_mat(*, *), y_mat(*, *) as m by m
read x_mat, y_mat
call additionner_Matrices giving x_mat(*, *), y_mat(*, *), x_mat(*,*);
call additionner_Matrices2 giving x_mat(*, *), y_mat(*, *)
yielding z_mat(*,*);