Как передать переменные по ссылке на функцию Scilab - PullRequest
0 голосов
/ 08 марта 2019

Я хочу иметь функцию Scilab, которая может изменять свои входные переменные, например, в C я мог бы иметь

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

В Scilab'е есть intppty, funptr, addinter, istk, sadr и stk, которые кажутся актуальными, однако я не могу найти никакого рабочего примера. Scilab действительно имеет тип pointer (т.е. 128). Буду признателен, если вы поможете мне разобраться в этом.

P.S.1. Я также отразил этот вопрос здесь, на Reddit .

PS2. Scilab также имеет intersci, SWIG, fort, external, call, API_Scilab / gateway, которые могут взаимодействовать C / C++ функций или Fortran подпрограмм. К сожалению, intersci устарел, а SWIG, похоже, только для Linux с ограниченной C++ совместимостью.

PS3. scilab имеет функцию перегрузки , которая может выполнять функции с функциями, определенными deff и комбинацией синтаксиса %, <...>, _... .

PS4. Способ API_Scilab / gateway работает, в основном вы разрабатываете код, используя функции, предусмотренные для файла заголовка api_scilab.h, компилируете его с ilib_build, пишите loader*.sce скрипт, а затем загрузить его с exec.

P.S.5. предположительно, можно установить mingw компилятор с

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

Однако я не могу заставить его работать, как я объяснил здесь .

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

Это возможно при использовании, например, шлюз 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 не был разработан для его использования!

0 голосов
/ 14 марта 2019

Насколько я понимаю, это невозможно, входные аргументы 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);
...