VC6.0与matlab7.1混合编程的案例(下)
四、函数的调用和参数传递
分析:函数
function
[r]=showsin(b,n)
;输入参数有
2
个为
b,n
,输出参数仅有
1
个为
r
;
1
、定义实参:
mxArray *b=NULL,*n=NULL,*r=NULL;
2
、设计界面如下图所示:
3
、参数传入方法实例:
A
、建立一个矩阵,并赋值给
mxArray
变量:
b=mxCreateDoubleMatrix(1,1,mxREAL);
B
、通过内存复制命名将,参数复制到定义的矩阵地址中:
memcpy(mxGetPr(b), &b1, sizeof (double));
//
将
b1
的值传入
其中
mxGetPr
函数是用来获取
mxArray
变量的地址函数;
4
、参数的传出实例:
A
、定义一个
double
型的变量用来接收参数结果:
double r1=0;
B
、再次利用内存复制命令将分析结果传复制出来:
memcpy(&r1,mxGetPr(r),sizeof(double));
5
、函数的调用,这里要注意的一点是第一个参数的含义,第一个参数为整型数,定义的为返回参数的个数,本例中返回参数为
1
个所以设为
1
,当设为
0
时是接收不到任何返回参数的,但不影响执行;返回参数必须用地址接收,也就是
mxArray
变量的指针的指针;
例如:
mlfShowsin(1,&r,b,n);
//
执行画图函数
6
、主要事件代码如下;
//edit by:favory.peng
#include
"
stdafx.h
"
#include
"
MAT7VC.h
"
#include
"
MAT7VCDlg.h
"
#include
"
mylib.h
"
//
定义参数
mxArray
*
b
=
NULL,
*
n
=
NULL,
*
r
=
NULL;
CMAT7VCDlg::CMAT7VCDlg(CWnd
*
pParent
/**/
/*=NULL*/
)
: CDialog(CMAT7VCDlg::IDD, pParent)
...
{
//{{AFX_DATA_INIT(CMAT7VCDlg)
m_b = -5.0;
m_n = 5.0;
m_r = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
mylibInitialize(); //初始化库
}
void
CMAT7VCDlg::OnBtnrun()
...
{
int out=1; //定义返回参数的个数
double b1=0,n1=0,r1=0;
UpdateData(true);
b1=m_b;
n1=m_n;
b=mxCreateDoubleMatrix(1,1,mxREAL);
n=mxCreateDoubleMatrix(1,1,mxREAL);
memcpy(mxGetPr(b), &b1, sizeof (double));
memcpy(mxGetPr(n), &n1, sizeof (double));
mlfShowsin(out,&r,b,n); //执行画图函数
//获取返回参数值
memcpy(&r1,mxGetPr(r),sizeof(double));
m_r.Format("%f",r1);
UpdateData(false);
}
void
CMAT7VCDlg::OnDestroy()
...
{
mylibTerminate(); //释放库资源
CDialog::OnDestroy();
}
7
、编译运行,在编译时可能与到
link
错误,请仔细检测上面的设置是否正确;并确认是否将将
mylib.h
、
mylib.lib
、
mylib.dll
加入到当前工程中;
效果如图:
五、程序发布和运行环境配置:
1
、拷贝
<MATLAB71_root>/toolbox/compiler/deploy/win32/MCRInstaller.exe
文件到目标机器上,点击执行安装,按提示信息进行安装;
2
、安装好
MCR
之后,将
<mcr_root>/v73/runtime/win32
加入到系统的环境变量
path
中去,还要将
<mcr_root>/v73/bin/win32
加入到系统的环境变量
path
中去;
3
、工程文件的可执行程序,使用的用户共享库
(DLL
文件,
lib
文件不需要
)
,共享库对应的
.ctf
文件。
<本文结束,By:Favory 2007-5-19>
【有什么问题希望一起交流探讨】