How to Convert a function return is a Handle (C++ mex)

조회 수: 3 (최근 30일)
huachun chen
huachun chen 2020년 1월 8일
댓글: huachun chen 2020년 1월 14일
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
James Tursa
James Tursa 2020년 1월 9일
Please provide more details of what you are trying to do.
huachun chen
huachun chen 2020년 1월 10일
Hi,James. I've added some descriptions, trying to return a void pointers from mex functions.

댓글을 달려면 로그인하십시오.

답변 (1개)

James Tursa
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.
  댓글 수: 1
huachun chen
huachun chen 2020년 1월 14일
Thank you for your reply, James.
It doesn't worked , I've tried to use the Load Library method, which is more concise, and work well.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Introduction to Installation and Licensing에 대해 자세히 알아보기

태그

제품


릴리스

R2012b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by