Bri*_*ian 7 c c++ matlab pointers mex
我正在编写一个mex文件(使用C++),它接受一个内存地址作为输入,并对该内存地址的数据进行操作.因为我被迫使用MATLAB作为我的环境,我的程序只能接受MATLAB数据类型作为输入(char,bool,float,double和int).如何将输入值分配给指针?
伪代码:
// Outside of program
// double input_arg = hex2dec('00C2E4E8')
double *pointer;
pointer = (double *)input_arg;
// pointer == hex2dec('00C2E4E8')
Run Code Online (Sandbox Code Playgroud)
基本上,这可以看作是我硬编码指针的值类似于:
double *pointer = (double *)hex2dec('00C2E4E8');
Run Code Online (Sandbox Code Playgroud)
我收到错误:
错误C2440:'=':无法从'double'转换为'double*'
我也尝试过使用static/const/reinterpret/dynamic_cast,但我真的不明白它们是如何工作的(我无法让它们工作).是否可以手动为指针分配内存地址值?
你要做的是危险的,因为你将原始指针传递给某些C++代码,对该位置存在的内容进行假设并根据这些假设执行代码.但是,假设您已经处理了所有这些安全问题.
您可能希望将指针作为UINT64传递给MEX文件(以便可以在64位的MATLAB安装中重新编译和使用代码).
在MATLAB方面:
ptrArg = uint64(hex2dec( '00C2E4E8' ));
myMexFile( ptrArg );
Run Code Online (Sandbox Code Playgroud)
在你的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
}
Run Code Online (Sandbox Code Playgroud)
注意:您也可以使用double进行相同操作,只需更改要mxGetClassID检查的检查即可mxDOUBLE_CLASS.在这种情况下,转换表达式变为:
double *p = reinterpret_cast<double *>( *mxGetPr( prhs[0] ) );
Run Code Online (Sandbox Code Playgroud)
编辑:
我所说的关于使这个代码在32或64位机器上工作的情况只有在两台机器都是小端的情况下才是真的.否则,如果你在一个big-endian机器上传递一个64位uint的32位指针并将其转换为a,double *你将得到一个指针0x00000000.
您可以使用MATLAB函数computer检测机器字节序,从而处理字节序问题.如果需要字节交换,您可以使用swapbytes.要使用C++代码执行这些函数mexCallMATLABWithTrap.