显式设置指针的值

时间:2011-08-08 17:37:03

标签: 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')

基本上,这可以看作是我硬编码指针的值,类似于:

double *pointer = (double *)hex2dec('00C2E4E8');

我收到错误:

  

错误C2440:'=':无法从'double'转换为'double *'

我也尝试过使用static / const / reinterpret / dynamic_cast,但我真的不明白它们是如何工作的(我无法让它们工作)。是否可以手动为指针分配内存地址值?

4 个答案:

答案 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