Scilab与VC++之间接口
今天成功地实现了Scilab与VC++之间的联结。故将基本过程记录如下:
1. Scilab与VC++之间主要通过动态链接库进行接口(注意:VC++是Win32平台下的,因此本文主要基于Win32平台);因此,要建立Scilab与VC++之间例程的接口,首先需要利用VC++创建相应的动态链接库。
假定我们利用VC++建立一个名字为sciVC.dll的动态链接库,该动态库中有一个名为SciToVC的函数,其原型如下:
void SciToVC(int *, double *, char *);
那么在Scilab里调用该函数的过程如此下:
2. 利用Scilab的link命令,连接sciVC.dll库和函数SciToVC,命令如下:
link(“C:\sciVC.dll”,”SciToVC”,”C”)
这里,link的C原型为:
int link(const char *PathOfDll, const char *NameOftheCalledFunction, const char * CorFortran);
其三个参数含义如下:
第一个参数:动态链接库的全路径;
第二个参数:被调函数的名字(大小写敏感);
第三个参数:”C”表示是C语言接口,如果是Fortran语言则为”F”;
3. 利用Scilab的fort命令,调用被成功连接的函数。其命令
如下:
res=fort("SciToVC",x,1,”i”, y,2,”d”, str,3,”c”, “out”)
这里fort的原型为
[y1,...,yk]=fort("ident",x1,px1,"tx1",...,xn,pxn,"txn", "out",[ny1,my1],py1,"ty1",...,[nyl,myl],pyl,"tyl")
其参数的含义如下表:
参数
说明
"ident" :
为字符串,被调函数的名字;
xi :
传给被调函数对应于的第i个形参的实参;
pxi:
实参xi对应于被调函数形参的位置编号(position of xi)。例如,xi为对应于第二个形参的实参,则pxi为整数2;
txi:
被调函数对应pxi位置的形参类型(type of xi),分别用"d" , "r" , "i" or "c"代表double, float, int,和 char*。
“out”:
关键字,在Scilab与C++接口中必须的(C与Fortran可以省略),是被调函数输入参数与输出参数的分割字。
[nyi,myi]:
第i个输出参数的维数,以矩阵形式表示。如[1,1]表示输出一个数,而[1,2]表示输出一个1x2矩阵。这个参数是必须的而且要跟其他输出相容。
pyi
第i个输出参数的位置
tyi
第i个输出参数的类型
例如,在上述调用res=fort("SciToVC",x,1,”i”, y,2,”d”, str,3,”c”, “out”)中,个参数的含义如下
x,对应第一个形参的实参,int类型;y对应第二个形参的实参,类型为double;str为对应第三个形参的实参,类型为字符串型;该函数没有参数输出。如果上述调用为:
res=fort("SciToVC",x,1,”i”, y,2,”d”, str,3,”c”, “out”,[1,1],1,”i”)
则表示第一个形参(注意:不是实参x)的结果将由fort返回在res里面。
最后需要说明的是,由于Scilab的变量都可以视为矩阵,建议将动态链接库里各个函数的参数全部设计成指针类型。
为了方便Scilab用户调用我们的函数,编写一个scilab脚本函数,把link, fort一起封装起来。例如,对于上述SciToVC函数的调用,可以写成一个如下的CallVC函数
function [y]=CallVC(aInt, aDouble, aString)
x=link(“sciVC.dll”,”SciToVC”,”C”)
if(x<0) y=-1 endif //测试连接是否成功,不成功则返回-1
y=fort(”SciToVC”,aInt,1,”i”,aDouble,2,”d”,Astring,3,”c”,”out”)
endfunction
这样,只要sciVC.dll在scilab的标准搜索路径里,就可以很方便地调用dll里的SciToVC函数了。