How pass variables by reference to a Scilab function

笑着哭i 提交于 2019-11-30 09:52:18

问题


I want to have a Scilab function which is able to alter its input variables, For example in C I could have

void double(int* x){
    *x *= 2;
    return;
}

There are intppty, funptr, addinter, istk, sadr and stk in Scilab which seem to be relevant, however I can't find any working example. Scilab does have a pointer type (i.e. 128). I would appreciate if you could help me figure this out.

P.S.1. I have also mirrored this question here on Reddit.

P.S.2. Scilab also have intersci, SWIG, fort, external, call, API_Scilab/gateway which can interface C/C++ functions or Fortran subroutines. Unfortunately intersci has been deprecated and SWIG seems to be only for Linux with limited C++ compatibility.

P.S.3. scilab has function overloading which can do stuff with the functions defined by deff and a combination of %,<...>,_... syntax.

P.S.4. The way API_Scilab/gateway works, is basically you dvelop the code using functionalities provided bu the header file api_scilab.h, compile it with ilib_build, write a loader*.sce script and then load it with exec.

P.S.5. supposedly one should be able to install mingw compiler with

atomsInstall('mingw'); atomsLoad('mingw');

However I am not able to get it to work as I have explained here.


回答1:


This is possible by using, e.g. a C++ Scilab 6 gateway (example needs a compiler on the machine, it should not be a problem for Linux and OSX users):

gw=[
"#include ""double.hxx"""
"#include ""function.hxx"""
"types::Function::ReturnValue sci_incr(types::typed_list &in, int _iRetCount,"
"                                      types::typed_list &out)"
"{"    
"    if (in.size() != 1 || in[0]->isDouble() == false) {"
"        throw ast::InternalError(""Wrong type/number of input argument(s)"");"
"    }"
"    types::Double *pDbl = in[0]->getAs<types::Double>();"
"    double *pdbl = pDbl->get();"
""    
"    for (int i=0; i < pDbl->getSize(); i++) (*pdbl) += 1.0;"
""
"    return types::Function::OK;"
"}"];
cd TMPDIR;
mputl(gw,TMPDIR+"/sci_incr.cpp");
ulink
ilib_build("incr", ["incr" "sci_incr" "cppsci"],"sci_incr.cpp", [])
exec loader.sce

After compilation/link of the interface, you can have the following behavior:

--> x=1
 x  = 

   1.

--> incr(x)

--> x
 x  = 

   2.

However, don't consider this as a feature, because the Scilab language has not been designed to use it !




回答2:


For my understanding this is not possible, in scilab input arguments are in the right side of the function and outputs are on the left side. See https://help.scilab.org/docs/6.0.2/en_US/function.html

[output,...] = function(input,...)

So, if you would like an input/output argument you have to assign the input argument to the output one inside your function.

[c] = f1(a, b)
     c = a + b    
endfunction

And you call it using same variable as input and output argument:

d = 10;
d = f1(d, 1);


来源:https://stackoverflow.com/questions/55060752/how-pass-variables-by-reference-to-a-scilab-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!