我正在编写一个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')
基本上,这可以看作是我硬编码指针的值,类似于:
double *pointer = (double *)hex2dec('00C2E4E8');
我收到错误:
错误C2440:'=':无法从'double'转换为'double *'
我也尝试过使用static / const / reinterpret / dynamic_cast,但我真的不明白它们是如何工作的(我无法让它们工作)。是否可以手动为指针分配内存地址值?
答案 0 :(得分:6)
似乎你不能使用浮点类型double
作为内存中地址的表示,它本身就是一个整数值。
我想你的input_arg
应该被定义为MATLAB int
类型,而不是double
。
答案 1 :(得分:5)
尝试:
double *pointer = (double *)0x00C2E4E8;
(添加0x)
答案 2 :(得分:5)
为什么input_arg是double?指针总是一些整数类型。
这可以解决“双倍转换为双倍”的问题
答案 3 :(得分:5)
您尝试做的事情很危险,因为您将原始指针传递给某些C ++代码,对该位置存在的内容进行假设并根据这些假设执行代码。但是,假设您已经处理了所有这些安全问题。
您可能希望将指针作为UINT64传递给MEX文件(以便可以在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] ) );
修改强>
我所说的关于将这些代码用于32位或64位机器的情况只有在两台机器都是小端的情况下才是真的。否则,如果在big-endian机器上传递64位uint中的32位指针并将其转换为double *
,则会得到一个0x00000000
的指针。
您可以使用MATLAB函数computer
来检测字节序问题,以检测机器字节序。如果需要字节交换,您可以使用swapbytes
。要从C ++代码执行这些功能,请使用mexCallMATLABWithTrap
。