我想使用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]));“
答案 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字节)