То, что вы пытаетесь сделать, опасно, потому что вы передаете необработанные указатели в некоторый код C ++, делаете предположения о том, что существует в этом месте и выполняете код, основываясь на этих предположениях. Но допустим, вы позаботились обо всех этих проблемах безопасности.
Возможно, вы захотите передать указатель на ваш MEX-файл как UINT64 (чтобы код можно было перекомпилировать и использовать как в 64-битной установке MATLAB).
На стороне MATLAB:
ptrArg = uint64(hex2dec( '00C2E4E8' ));
myMexFile( ptrArg );
В вашей функции mex:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if( nrhs < 1 ) {
// error
} else {
// Verify that the address argument is a UINT64
if( mxGetClassID( prhs[0] ) != mxUINT64_CLASS ) {
// error
}
}
// Done with error checking, now perform the cast
uint64_T mlData = *static_cast<unsigned long long *>( mxGetData( prhs[0] ) );
double *p = reinterpret_cast<double *>( mlData );
// Do whatever with p
}
Примечание: Вы можете сделать то же самое с двойным, просто измените проверку mxGetClassID
, чтобы найти mxDOUBLE_CLASS
. В этом случае приведенное выражение становится:
double *p = reinterpret_cast<double *>( *mxGetPr( prhs[0] ) );
EDIT:
То, что я сказал о том, чтобы заставить этот код работать на 32- или 64-битной машине, верно только в том случае, если обе машины имеют порядок байтов. В противном случае, если вы передадите 32-разрядный указатель в 64-разрядном коде uint на машине с прямым порядком байтов и приведете его к double *
, вы получите указатель, равный 0x00000000
.
Вы можете справиться с проблемами порядка байтов с помощью функции MATLAB computer
для определения порядка машин. Если требуется замена байтов, вы можете использовать swapbytes
. Для выполнения этих функций из вашего кода C ++ используйте mexCallMATLABWithTrap
.