IMEXEC (3I)     version 4.6.9     March 2022

User Intro    Prog Intro    Liste des programmes    Liste des manuels
Table of Contents


NAME

exec, imexec - appel d'une subroutine avec allocation dynamique de mémoire

SYNOPSIS

subroutine exec(ier,nfixe,idimf,nvar,ipoids,proc, p1,...,pk,ier)
subroutine imexec(ier,nfixe,idimf,nvar,ipoids,proc, p1,...,pk,excend)
integer ier,nfixe,idimf(nfixe),nvar,ipoids(nvar)
external proc
common /koctet/ mem
common /excend/ excend

imexec_(ier,nfixe,idimf,nvar,ipoids,proc, p1,...,pk,excend)
exec_(ier,nfixe,idimf,nvar,ipoids,proc, p1,...,pk,ier)
Fort_int *ier, *nfixe, *nvar, *idimf, *ipoids, (*proc)(), excend_;
Fort_int *p1, ... *pk;

DESCRIPTION

exec, imexec appellent la subroutine proc qui sera de la forme :


	subroutine proc( [f1,..,fn,idimf,] [v1,..,vm,idimv,]  p1,..,pk)
	dimension f1(1),...,fn(m),v1(1),...,vm(1)
	integer idimf(n),idimv(n)


void proc( [f1,..,fn,idimf,] [v1,..,vm,idimv,]  p1,..,pk)
Fort_int *f1,...,*fn,*v1,...,*vm;
Fort_int *idimf, *idimv;

Les paramètres f1,..,fn sont des tableaux alloués dynamiquement par exec et dont les tailles sont contenues dans idimf. L'unité est la taille de l'objet le plus grand parmi les types int, long et char* : elle est égale à sizeof(t_aligned). Si n est nul les parametres correspondants ne sont pas générés dans la liste d'appel.

Les paramètres v1,..,vm sont des tableaux alloués dynamiquement par exec et dont les tailles en mots sont contenues dans idimv. Si m est nul les paramètres correspondants ne sont pas générés dans la liste d'appel.
Le calcul des tailles de v1,..,vm est effectué à partir des poids respectifs donnés dans ipoids, en fonction de l'espace dynamique disponible.

La taille en kilos octets de l'espace dynamique désiré doit être donnée dans la variable externe koctet_ qui vaut par défaut 100 ( 100k octets ). Cet espace est alloué par malloc, et partagé entre les tableaux 'fixes' f1,..,fn dont la taille est connue et les tableaux 'variables' v1,..,vn qui sont répartis sur l'espace restant en fonction de leur poids ( un tableau de poids 2 sera 2 fois plus grand qu'un tableau de poids 1 ).
Au retour de exec l'espace dynamique est restitué au système (par free).
Dans le cas d'appels imbriqués l'allocation se fait de nouveau sur la valeur de koctet_.

Le paramètre ier reçoit la valeur 0 si l'appel s'effectue correctement.

On notera que les arguments sont en nombre variables. Il faut absolument un repère de fin de liste d'arguments : variable globale excend_ (en C) ou common /excend/ (en Fortran) pour imexec, et répétition de la variable ier pour exec.
Il est à noter que l'on peut utiliser indifféremment excend_ ou &excend_ (la variable contient sa propre adresse).

EXAMPLE:

extern int proc();
Fort_int ier, n, idimf[?], m, ipoids[?];
	.....
	n=...;
	m=...;
	exec_(&ier,&n,idimf,&m,ipoids,proc,p1,..,pk,&ier);
	if(ier)
	....

	external proc
	integer idimf(?), ipoids(?)
	......
	n = ...
	m = ...
	call exec(ier,n,idimf,m,ipoids,proc,p1,..,pk,ier)
	...

"SEE ALSO"

malloc(3), imerror(3i)

DIAGNOSTICS

exec fait un exit(-1) si l'appel ne peut pas s'effectuer correctement.
imexec appelle imerror si l'appel ne peut pas s'effectuer correctement.
exec, imexec font un appel à setjmp pour récupérer les erreurs (produites par les programmes qui appellent imerror ou ermesf. En cas d'erreur, on revient du programme exec ou imexec avec une valeur non nulle dans l'argument ier.

BUGS

Le nombre total de paramètres de proc est limite à 50.
L'utilisation de exec sans terminer la liste de paramètres par répétition de ier est fortement déconseillée.