簡體   English   中英

顯式設置指針的值

[英]Explicitly setting the value of a pointer

我正在編寫一個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,但我真的不明白它們是如何工作的(我無法讓它們工作)。 是否可以手動為指針分配內存地址值?

看起來你不能使用double (浮點類型)作為內存中地址的表示,它本身就是一個整數值。

我猜你的input_arg應該定義為MATLAB int類型,而不是double

嘗試:

double *pointer = (double *)0x00C2E4E8;

(加0x)

為什么input_arg是double? 指針總是一些整數類型。

這可以解決“雙倍轉換為雙倍*”

你要做的是危險的,因為你將原始指針傳遞給某些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
}

注意:您也可以使用double執行相同操作,只需更改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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM