2017-01-25 2 views
1

私は単純なmex関数を書こうとしています。私は自分のオブジェクトの数である整数の入力を持っています。 私はmyMEX_1.cppをコンパイルし、任意の入力値とMATLABでそれを呼び出すと、私は常に取得:要求されたオブジェクトのmxGetPrとmxGetDataの使用

数:0

しかしmyMEX_2.cpp正常に動作し、MATLABから入力された番号を表示しますコマンドウィンドウ。 私の間違いはどこですか?myMEX_1.cpp

私の環境:MATLAB R2013aとMicrosoft SDK 7.1コンパイラ。

// myMEX_1.cpp 
#include "mex.h" 
void mexFunction(int nlhs,  mxArray *plhs[], 
       int nrhs, const mxArray *prhs[]) 
{ 

    char str11[100]; 
    unsigned short frameCount; 
    //unsigned short *frameCountPtr; 
    frameCount = (*((unsigned short*)mxGetData(prhs[0]))); 
    sprintf(str11, "Number of Requested Objects := %d:\n", frameCount); 
    mexPrintf(str11); 
} 





// myMEX_2.cpp 
#include "mex.h" 
void mexFunction(int nlhs,  mxArray *plhs[], 
       int nrhs, const mxArray *prhs[]) 
{ 
    char str11[100]; 
    unsigned short frameCount; 
    double* dblPointer; 
    dblPointer = mxGetPr(prhs[0]); 
    frameCount = (unsigned short)(*dblPointer); 
    sprintf(str11, "Number of Requested Objects := %d:\n", frameCount); 
    mexPrintf(str11); 
} 

答えて

3

mxGetData正しいデータ型のポインタにキャストされなければならないvoidポインタを返します。

はCで、mxGetDatavoidポインタ(void *)を返します。 voidポインタが何の種類を持っていない値を指しているので、があなたの場合はpm

で指定された型と一致するポインタ型への戻り値をキャストし、私は「それはあなたのように見えますが、と仮定しています実際にはdoubleです。これはMATLABのデフォルトのデータ型であるため、問題はunsigned shortポインタに変換しようとしているためです。

myMEX_1(1)   % Passes a double 
myMEX_1(uint16(1)) % Passes an integer 

これを修正するために、我々は代わりにdoubleポインタとしてmxGetDataの出力をキャストする必要があるだろうし、それは、それをキャストし、それ

frameCount = (unsigned short)*(double*)mxGetData(prhs[0]); 

mxGetPrmxGetDataと同じである割り当てるデリファレンスを除き、mxGetDataの出力をdoubleポインターとして自動的にキャストします。したがって、それはあなたにステップを保存しますが、これはあなたが持っているdoubleの入力に対してのみ適切です。

複数のタイプの入力を適切に処理する場合は、mxIsDoubleまたはmxIsClassのいずれかを使用して入力のタイプを確認する必要があります。

if (mxIsDouble(prhs[0])) { 
    frameCount = (unsigned short)*mxGetPr(prhs[0]); 
} else if (mxIsClass(prhs[0], "uint16") { 
    frameCount = *(unsigned short*)mxGetData(prhs[0]); 
} else { 
    mexPrintf("Unknown datatype provided!"); 
    return; 
} 
+0

'mxGetPr'は、入力引数の型とはまったく無関係に常に' * double'を返します。 – GntS

+0

@GmtK私はそれを考えましたが、ただそれをチェックしていました。 'myMEX_1(uint16(1))' – Suever

+0

関数プロトタイプはMATLABのヘルプに 'double * mxGetPr(const mxArray * pm);と表示されます; – GntS

関連する問題