Pass pointer to scalar variable in mex function

15 visualizaciones (últimos 30 días)
Christopher Grose
Christopher Grose el 22 de Ag. de 2019
Editada: James Tursa el 23 de Ag. de 2019
I am having trouble passing a pointer to a scalar variable in a MEX function. The ability to modify variables in the C function without copy-write overhead is highly desirable to me. I have never had trouble passing pointers to vectors using mxGetPr(), but mxGetScalar() seems to only make a copy and modify the copy in the MEX function. The only way I've gotten around this before is by making the scalar variable into a vector and just using the first element, but this is pretty silly.
Another user had a similar question here : https://www.mathworks.com/matlabcentral/answers/306211-in-mex-file-i-can-t-overwrite-scalar-value-through-the-pointer-in-matlab2016a-although-i-can-overw but I do not see if a solution was offered (using an early MATLAB version is not possible, as I need more recent capabilities, such as declaring more data types).
So, if I wanted to get a pointer to the scalar variable 'kijc' in the following, how would I modify the code? I am compiling with R2018a.
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
/* INPUTS */
double *Ctst1 = mxGetPr(prhs[0]);
double *Ctst0 = mxGetPr(prhs[1]);
double kijc = mxGetScalar(prhs[2]);
int32_t cind1 = mxGetScalar(prhs[3]);
int32_t cind2 = mxGetScalar(prhs[4]);
double Qijc0 = mxGetInt32s(prhs[5]);
double Pdif = mxGetLogicals(prhs[6]);
int32_t numinterdiff = mxGetScalar(prhs[7]);
/* run myfunc */
myfunc(Ctst1,Ctst0,kijc,cind1,cind2,Qijc0,Pdif,numinterdiff); // modifies kijc
}
  1 comentario
James Tursa
James Tursa el 22 de Ag. de 2019
Editada: James Tursa el 22 de Ag. de 2019
What is the signature (i.e., argument types) of myfunc( )? Which arguments of myfunc( ) are you intending to change in-place? Is the problem that you can't trust changing a scalar variable in-place in a mex routine will carry back to the caller (per the link you provided)?

Iniciar sesión para comentar.

Respuestas (1)

James Tursa
James Tursa el 22 de Ag. de 2019
Editada: James Tursa el 23 de Ag. de 2019
"... The only way I've gotten around this before is by making the scalar variable into a vector and just using the first element, but this is pretty silly ..."
Yes, I agree, but that is what the newer API forces you to do. Or maybe make it part of a cell or struct variable would work also. Regardless, that's extra work at both ends of the processing caused by what IMO can only have been a very minor performance gain at the MATLAB level.
You should read the following post ... you may be in trouble with your non-scalar variables also.
If you know which variables are scalars (or just small) in advance, it would probably be best to just create new variables inside the mex routine, pass them out, and assign them to the variables you want at the m-file level.

Categorías

Más información sobre Write C Functions Callable from MATLAB (MEX Files) en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2018a

Community Treasure Hunt

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

Start Hunting!

Translated by