显式设置指针的值

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,但我真的不明白它们是如何工作的(我无法让它们工作).是否可以手动为指针分配内存地址值?

ser*_*gio 6

似乎你不能使用a double(浮点类型)作为内存中地址的表示,它本身就是一个整数值.

我想你input_arg应该被定义为MATLAB int类型,而不是a double.


neo*_*phi 5

尝试:

double *pointer = (double *)0x00C2E4E8;

(加0x)


Jon*_*son 5

为什么input_arg是double?指针总是一些整数类型.

这可以解决"双倍转换为双倍*"


Pra*_*ian 5

你要做的是危险的,因为你将原始指针传递给某些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.

  • 这也不太正确.`mxGetData`返回一个指向Matlab数组中由Matlab分配的数据数组的指针,而不是第一个元素中的值.你需要另一个解除引用的步骤,比如`(*(mxGetData(prhs [0])))`.如果这是在32位运行,reinterpret_cast将是错误的,因为它将把uint64的上半部分和下半部分块化为32位指针值.需要将值复制到int,或者假设调用者将传递与`sizeof(void*)`相同宽度的地址值并使用typedefs. (2认同)