Fortran or C user routines call (original) (raw)
Please note that the recommended version of Scilab is 2026.0.1. This page might be outdated.
See the recommended documentation of this function
Scilab help >> Dynamic/incremental Link > call
Fortran or C user routines call
Calling Sequence
[y1,...,yk] = call("ident",x1,px1,"tx1",...,xn,pxn,"txn","out",[ny1,my1],py1,"ty1",...,[nyl,myl],pyl,"tyl")
[y1,....,yk] = call("ident",x1,...,xn)
Arguments
"ident"
string.
xi
real matrix or string
pxi, pyi
integers
txi, tyi
character string "d","r", "i" or"c".
Description
Interactive call of Fortran (or C) user program from Scilab. The routine must be previously linked with Scilab. This link may be done:
- with Scilab "
link" command (dynamical linking) during the Scilab session.(seelink)
On Windows, C functions must use cdecl calling convention name (see options in your C compiler(default calling convention for x86 C compilers)).
There are two forms of calling syntax, a short one and a long one. The short one will give faster code and an easier calling syntax but one has to write a small (C or Fortran) interface in order to make the short form possible. The long one make it possible to call a Fortran routine (or a C one) whitout modification of the code but the syntax is more complex and the interpreted code slower.
The meaning of each parameter is described now:
"ident"
is the name of the called subroutine.
x1,...,xn
are input variables (real matrices or strings) sent to the routine,
px1,...,pxn
are the respective positions of these variables in the calling sequence of the routine "ident" and
tx1,...,txn
are their types ("r","i", "d" and"c" for real (float) , integer, double precision and strings)
"out"
is a keyword used to separate input variables from output variables. when this key word is present it is assumes that the long form will be used and when it is not prsent, the short form is used.
[ny1, my1]
are the size (# of rows and columns. For 'c' arguments,m1*n1 is the number of charaters ) of output variables and
py1, ...
are the positions of output variables (possibly equal topxi ) in the calling sequence of the routine. Thepyi's integers must be in increasing order.
"ty1", ...
are the Fortran types of output variables. Thek first output variables are put iny1,..., yk.
If an output variable coincides with an input variable (i.e.pyi=pxj ) one can pass only its positionpyi . The size and type of yi are then the same as those of xi. If an output variable coincides with an input variable and one specify the dimensions of the output variable [myl,nyl] must follow the compatibility condition mxk*nxk >= myl*nyl.
Examples
f1=['#include <math.h>' 'void fooc(double c[],double a[],double *b,int *m,int *n)' '{' ' int i;' ' for ( i =0 ; i < (m)(*n) ; i++) ' ' c[i] = sin(a[i]) + *b; ' '}'];
mputl(f1,'fooc.c')
ilib_for_link('fooc','fooc.c',[],"c")
exec loader.sce
a=[1,2,3;4,5,6];b= %pi; [m,n]=size(a);
c=call("fooc",a,2,"d",b,3,"d",m,4,"i",n,5,"i","out",[m,n],1,"d");
f1=[' subroutine foof(c,a,b,n,m)' ' integer n,m' ' double precision a(),b,c()' ' do 10 i=1,m*n ' ' c(i) = sin(a(i))+b' ' 10 continue' ' end']; mputl(f1,'foof.f')
ilib_for_link('foof','foof.c',[],"f")
exec loader.sce
a=[1,2,3;4,5,6];b= %pi; [m,n]=size(a); c=call("foof",a,2,"d",b,3,"d",m,4,"i",n,5,"i","out",[m,n],1,"d");
See Also
- link — dynamic linker
- c_link — check incremental/dynamic link
- intersci — Scilab tool to interface C or Fortran functions with scilab
- addinter — new functions interface dynamic link at run time.
- api_scilab — api_scilab is the Scilab interface to read/write data from/to Scilab memory