基础知识(二)matlab与c++混合编程之经验笔记

开发环境:win7 64位+vs2010+matlab

学习matlabc++混合编程的路上有时候会遇到莫名其妙的错误,因此做一下记录:

1由于系统是64位,装的matlab的链接库也是64位,如果使用win32控制台32位,需要配置管理器-》配置为X64

2、在c++中调用mwarray类,若未初始化,会出现直接运行没问题,然而调试的时候,出现内存异常,因此需要在调用mwarray前调用初始化函数mclInitializeApplication、及动态链接库的初始化函数。

3matlab函数最好把函数返回的结果数据转置,因为matlab是根据列存储的,记住只是存储的时候有区别,但在matlab显示行列的时候并没有变,直接用mwarray的getdata()获取数据时,顺序会出错。

4如果在matlab函数中有形参未被引用,可能会引起奔溃,例如 :

错误形式:

function [ output_args ] = test( input_args )

end

由于该代码中output_args 未被调用  在c++中编译后,会出现函数没有返回参数的错误,最终引起程序崩溃

正确应该为:

function [ output_args ] = test( input_args )

output_args=input_args;

end

5.返回参数问题:返回的参数直接声明对象为mwArray Y;而无需定义矩阵的宽高,但是切记需要被引用

6在控制台应用程序中,如果matlab中有绘制图片等绘制函数,则程序运行后,不会跳出matlab绘制窗口;然而使用mfc程序调用,可以 跳出matlabfigure等窗口

7不同的电脑上版本matlab不一致的时候,matlab需要重新生成链接库,否者估计编译完成后,运行的时候出现,找不到某个动态链接库的情况

8调用前需要初始化模块,调用结束后要关闭matlab模块,共需要调用4句函数假设链接库名为:plotsintest

 

//调用前

if( ! mclInitializeApplication(NULL,0) )

{        

   fprintf(stderr, "Could not initialize the application.\n");

   exit(1);

}

if (! plotsintestInitialize() )

{

    fprintf(stderr,"Could not initialize the library.\n");

    exit(1);

}

//matlab数据处理函数

 processfunction();

 

 //调用后 

//两句要么不要调用,不调用可实现matlab模块与mfc程序窗口共存的功能,要么一起调用,调用将销毁matlab的相关窗口,或数据

plotsintestTerminate();//关闭函数 如果不关闭,matlab的绘制窗口不会被销毁

mclTerminateApplication();//关闭matlab函数

9、建议在mfc程序构造函数中调用mclInitializeApplication、plotsintestInitialize、析构函数中调用plotsintestTerminate、mclTerminateApplication,由于以上两个初始化函数的初始化时间很长,所以建议这么调用在程序启动的时候完成初始化,然后在进行程序中多次调用matlab函数。

10、matlab函数中不允许调用clear()函数,否则c++调用的时候回引起程序崩溃

本文地址:http://blog.csdn.net/hjimce/article/details/45167679 作者:hjimce     联系qq:1393852684

更多资源请关注我的博客:http://blog.csdn.net/hjimce                  原创文章,转载请保留本行作者信息


你可能感兴趣的:(基础知识(二)matlab与c++混合编程之经验笔记)