Matlab R2015b 64位使用mex时出错

时间:2015-12-24 19:10:53

标签: c++ matlab mex

我想使用Matlab R2015b“

编译以下代码
#include "mex.h"
#include "GLTree.cpp"
/* the gateway function */
//la chiamata deve essere DeleteGLtree(Tree)

void mexFunction( int nlhs,const mxArray *plhs[], 
    int nrhs, const mxArray *prhs[1]) {


//dichiarazione variabili
GLTREE* Tree;
double *ptrtree;



 if(nrhs!=1){ mexErrMsgTxt("Only one input supported.");}




ptrtree = mxGetPr(prhs[0]);//puntatore all'albero precedentemente fornito


Tree=(GLTREE*)((long)(ptrtree[0]));//ritrasformo il puntatore passato

if(Tree==NULL)
{ mexErrMsgTxt("Invalid tree pointer");
}


//chiamo il distruttore

 delete Tree;  }

但我收到此错误“C:\ Users \ Admin \ Documents \ MATLAB \ GraphSeg \ GLtree3DMex \ DeleteGLTree.cpp:15:38:警告:从不同大小的整数转换为指针[-Wint-to-pointer-投]      树=(GLTREE *)((长)(ptrtree [0]));“

2 个答案:

答案 0 :(得分:4)

您错误地声明了mexFunction。你的声明:

void mexFunction( int nlhs,const mxArray *plhs[], int nrhs, const mxArray *prhs[1])

不等同于:

void mexFunction( int nlhs,mxArray *plhs[], int nrhs, const mxArray *prhs[])

回答你的问题

您需要在const之前删除mxArray *plhs[]

进一步评论:

您可能想要查看此链接,将内存地址从mex函数传回MATLAB。我的直觉是,你偶然使用一个double并且长时间(或者甚至很长很长时间)都可能是非常有问题的...它应该是一个uin64,并且为了健壮,你可能需要一些额外的编译检查类型一切都匹配,一切都是8字节...... http://www.mathworks.com/matlabcentral/answers/75524-returning-and-passing-void-pointers-to-mex-functions

答案 1 :(得分:1)

这是基于你的代码的猜测(我没有编译它):在64位机器上,地址空间有大小为8字节(64位)的指针,你输出一个指向类型{{ 1}}这可能只有4个字节长。如果你想要转换你应该使用8字节长的类型,例如long(保证至少8字节)