[英]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.