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

5 vues (au cours des 30 derniers jours)
huachun chen
huachun chen le 8 Jan 2020
Commenté : huachun chen le 14 Jan 2020
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 commentaires
James Tursa
James Tursa le 9 Jan 2020
Please provide more details of what you are trying to do.
huachun chen
huachun chen le 10 Jan 2020
Hi,James. I've added some descriptions, trying to return a void pointers from mex functions.

Connectez-vous pour commenter.

Réponses (1)

James Tursa
James Tursa le 10 Jan 2020
Modifié(e) : James Tursa le 10 Jan 2020
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 commentaire
huachun chen
huachun chen le 14 Jan 2020
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.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Introduction to Installation and Licensing dans Help Center et File Exchange

Tags

Produits


Version

R2012b

Community Treasure Hunt

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

Start Hunting!

Translated by