我想拥有一个Scilab函数,该函数能够更改其输入变量,例如在C
中我可以拥有
void double(int* x){
*x *= 2;
return;
}
在Scilab中有intppty
,funptr
,addinter
,istk
,sadr
和stk
似乎很相关,但是我找不到任何有效的示例。 Scilab确实具有pointer
类型(即128
)。如果您能帮助我解决这个问题,我将不胜感激。
P.S.1。。我也反映了这个问题here on Reddit。
PS2。 Scilab还具有intersci
,SWIG
,fort
,external
,call
,{{1} } / API_Scilab
,可以连接gateway
/ C
函数或C++
子例程。不幸的是,Fortran
已过时,intersci
似乎仅适用于SWIG
兼容性有限的Linux。
PS3。 scilab具有function overloading,可以使用C++
定义的功能以及deff
,%
, <...>
语法。
PS4。 _...
/ API_Scilab
的工作方式基本上是使用头文件gateway
提供的功能扩展代码,并使用api_scilab.h
,编写一个ilib_build
脚本,然后使用loader*.sce
加载它。
P.S.5。。应该可以使用
安装exec
编译器
mingw
但是,正如我所解释的here,我无法使其正常工作。
答案 0 :(得分:2)
这可以通过使用例如C ++ Scilab 6网关(示例需要计算机上的编译器,对于Linux和OSX用户来说应该不是问题):
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
接口的编译/链接后,您可以具有以下行为:
--> x=1
x =
1.
--> incr(x)
--> x
x =
2.
但是,不要将其视为功能,因为Scilab语言并非旨在使用它!
答案 1 :(得分:0)
据我所知,这是不可能的,在scilab中,输入参数位于函数的右侧,而输出则位于左侧。参见https://help.scilab.org/docs/6.0.2/en_US/function.html
[output,...] = function(input,...)
因此,如果想要输入/输出参数,则必须在函数内部将输入参数分配给输出参数。
[c] = f1(a, b)
c = a + b
endfunction
然后使用与输入和输出参数相同的变量来调用它:
d = 10;
d = f1(d, 1);