Simscript III/Dictionnaire des instructions/ROUTINE

L’énoncé routine marque le début d’un sous-programme de type routine.

Syntaxe :



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(*,*);