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、再次利用内存复制命令将分析结果传复制出来:
B、再次利用内存复制命令将分析结果传复制出来:
memcpy(&r1,mxGetPr(r),sizeof(double));
5、函数的调用,这里要注意的一点是第一个参数的含义,第一个参数为整型数,定义的为返回参数的个数,本例中返回参数为1个所以设为1,当设为0时是接收不到任何返回参数的,但不影响执行;返回参数必须用地址接收,也就是mxArray变量的指针的指针;
例如:mlfShowsin(1,&r,b,n); //执行画图函数
6、主要事件代码如下;

#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>
【有什么问题希望一起交流探讨】