How to Convert a function return is a Handle (C++ mex)
조회 수: 3 (최근 30일)
이전 댓글 표시
Hi, I'm new to Matlab and looking for an example which demonstrates how to convert a function return is a Handle. (c++ mex)
C header, two function :
typedef void * DEVICE_HANDLE
DEVICE_HANDLE FUNC_CALL ZCAN_OpenDevice (UINT device_type, UINT device_index, UINT reserved);
mex:
void mexFunction(int nlhs,mxArray *plhs[],int nrhs, const mxArray *prhs[])
{
typedef void * DEVICE_HANDLE;
void *A;
unsigned int C;
if( nrhs != 3)
{
mexErrMsgTxt("MEXCPP requires 3 input arguments.");
return;
}
nlhs=1;
unsigned int p1 = mxGetScalar(prhs[0]);
unsigned int p2 = mxGetScalar(prhs[1]);
unsigned int p3 = mxGetScalar(prhs[2]);
mexPrintf("%s%d\t%s%d\t%s%d\n", "P1: ", p1, "P2 :", p2,"P3 :",p3);
plhs[0] = mxCreateNumericMatrix(1,1,mxUINT32_CLASS,mxREAL);
A = (unsigned int *) mxGetPr(plhs[0]);
C = (unsigned int)ZCAN_OpenDevice(p1,p2,p3);
mexPrintf("%s%d\n", "return: ", C);
A =C;
}
댓글 수: 2
답변 (1개)
James Tursa
2020년 1월 10일
편집: James Tursa
2020년 1월 10일
DEVICE_HANDLE is a pointer, so if you are running 64-bit MATLAB then DEVICE_HANDLE will be be 64-bits and will not fit in a 32-bit unsigned int. Thus it seems that your code will lose information when you do the (unsigned int) cast.
To return the value of the (void *) back to MATLAB you could do something like this:
union { void *A;
unsigned long long u;
} Au;
unsigned long long *A;
:
plhs[0] = mxCreateNumericMatrix(1,1,mxUINT64_CLASS,mxREAL);
A = (unsigned long long *) mxGetData(plhs[0]);
Au.A = ZCAN_OpenDevice(p1,p2,p3);
*A = Au.u;
But that begs the question, what are you intending to do with this pointer at the MATLAB level? I strongly suspect that you still have some fundamental design issues with your code that will lead to a crash.
참고 항목
카테고리
Help Center 및 File Exchange에서 Introduction to Installation and Licensing에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!