博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
matlab 与 VC 混编函数参数传递<1>
阅读量:7088 次
发布时间:2019-06-28

本文共 2068 字,大约阅读时间需要 6 分钟。

关于在C++程序中调用MATLAB编译产生的动态链接库。具体的问题是在 调用DLL中函数时传递参数。我们知道,MATLAB可以把m代码编译成两种DLL,分别是C语言接口和C++语言接口的DLL。问题是关于调用 C++接口的DLL中的函数,所以这里我们就以这种DLL为例来介绍。在C++接口的DLL中,函数的输入、输出参数都是mwArray对象。所以问题归 结为如何在C++程序中使用mwArray。

1. mxArray和mwArray的比较:

     1)mxArray是Matlab C 函数库的结构体,而mwArray是Matlab C++ 函数库中对mxArray的包装类。

其 次,二者的内存管理方式不同。mxArray的内存管理方式比较松散,由于是C函数库,没有数据封装,必须对临时阵列和约束阵列的概念极为明确,并且须小 心地防止内存泄漏(要多写好多代码)。尽管有自动内存管理机制 (mlfEnterNewContext,mlfReleasePreviousContext),仍然要处处调用mlfAssign,麻烦得很。然而 mwArray就好的多,一切交给C++对象去搞定,你只要放心地用就可以了。不过Matlab C++函数库为了防止频繁内存分配和释放重写了内存分配和释放等函数。你会发现对于mwArray a,b; a=b;实际上并没有生成两个相同数据块,只是指针,只有发成数据改变时才copy完整数据。
    2) 这两个东西各自有一套与之相对应的函数。函数的返回值类型不同,需要多加注意。
最后,用的时候mxArray要使用指针,而mwArray直接当类对象使。

声明:

mxArray:

mxArray *a;

mwArray

mwArray a;

 

销毁

mxArray

mxDestroyArray a;

mwArray

mwArray类的析构函数自动销毁对象

 

变量传递

mxArray

memcpy(dest_ptr,source_ptr,MAX_SIZE);

mwArray

mwArray in1(3, 3, mxDOUBLE_CLASS, mxREAL);

mwArray in2(3, 3, mxDOUBLE_CLASS, mxREAL);
in1.SetData(data, 9);
in2.SetData(data, 9);

 

比较而言,

1、mwArray的声明更简洁,不用考虑指针

 

2、mwArray不用手动释放内存

2. 例子

 

 

       关于VC与MATLAB混编的设置,见前几个转帖。下面是这个例子用到的m代码。它定义了一个名为test的函数,保存在test.m文件中:

function y=test(x)

y=sin(x);
plot(x,y,'*');
end

首先把这个函数编译成C++接口的DLL:

mcc -W cpplib:dlltest -T link:lib test.m

结果,我们将会得到包含dlltest .dll,dlltest .h,dlltest .lib等在内的一些文件。接下来我们只需要这3个文件。 (dlltest .ctf( 这个文件在7.1之后的版本就没有了, 如果是需要, 加上-C 参数。这里我们不要))

      此时,打开dlltest.h看看,在文件的最下面我们可以发现C++接口的函数定义。仔细观察过后,我们可以发现,这个接口函数的参数是按照这样的顺序定义的:输出参数的个数、输出参数、以及输入参数。

       然后在VC6中创建一个VC++工程(我创建了个基于对话框做测试),取名为VCMATLAB.把以上四个文件拷贝到VC++工程的源代码所在目录。

工程中加入头文件:dlltest .h

设置工程的引用库:project—》links里添加mclmcrrt.lib dlltest.lib(注:debug和release是相互独立的)

vc工程加入代码如下:

#include "mclmcr.h" // mwArray声明

#include "dlltest.h"

void CVCMATLABDlg::OnButton1()

{
// TODO: Add your control notification handler code here
mclInitializeApplication(NULL,0);
dlltestInitialize();
mwArray x(10,10,mxDOUBLE_CLASS);
double *xData;
xData = new double[100];
int i;
for( i=0; i<100; ++i){
xData[i] = -5+(0.1*i);
}
x.SetData(xData, 100);
mwArray y(10,10,mxDOUBLE_CLASS);
huatu_test(1,y,x); 
dlltestTerminate();                             
mclTerminateApplication();
}
编译运行结果:

转载地址:http://fcfql.baihongyu.com/

你可能感兴趣的文章
C# IEnumerable和IEnumerator的区别,如何实现
查看>>
android adb命令行工具使用
查看>>
[转]聊聊.net程序设计——浅谈使用VS2010建模拓展
查看>>
Central Europe Regional Contest 2011
查看>>
每天一个linux命令(12):more命令
查看>>
javascript 正则替换字符的新方法!
查看>>
OSGI:从面向接口编程来理解OSGI
查看>>
前端之JavaScript(1) - 浅谈JavaScript函数与栈
查看>>
WayOs 帐号到期自动清理工具,致浪费在清理到期用户的青春
查看>>
新买的mac笔记本,发现vi编辑器没有颜色的解决方案
查看>>
object-c 混编 调用C,C++接口
查看>>
JQuery Ajax实例总结
查看>>
CentOS中文件夹基本操作命令
查看>>
VS2008 Project : error PRJ0019: 某个工具从以下位置返回了错误代码: "正在执行生成后事件..."解决方案...
查看>>
js判断图片是否存在,并做处理
查看>>
触摸屏
查看>>
webservice 测试窗体只能用于来自本地计算机的请求
查看>>
Java 中队列的使用
查看>>
再见 2014,你好 2015
查看>>
13 SELECT 以外的内容
查看>>