如何通过引用Scilab函数来传递变量

时间:2019-03-08 09:58:59

标签: function pointers parameter-passing pass-by-reference scilab

我想拥有一个Scilab函数,该函数能够更改其输入变量,例如在C中我可以拥有

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

在Scilab中有intpptyfunptraddinteristksadrstk似乎很相关,但是我找不到任何有效的示例。 Scilab确实具有pointer类型(即128)。如果您能帮助我解决这个问题,我将不胜感激。

P.S.1。。我也反映了这个问题here on Reddit

PS2。 Scilab还具有intersciSWIGfortexternalcall,{{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,我无法使其正常工作。

2 个答案:

答案 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);