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;
subroutine proc( [f1,..,fn,idimf,] [v1,..,vm,idimv,] p1,..,pk) dimension f1(1),...,fn(m),v1(1),...,vm(1) integer idimf(n),idimv(n)
où
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).
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)
...