2017-01-25 2 views
1

Ich versuche, eine einfache Mex-Funktion zu schreiben. Ich habe eine ganzzahlige Eingabe, die die Anzahl meiner Objekte ist. Wenn ich myMEX_1.cpp kompilieren und von MATLAB mit jedem Eingabewert nennen, habe ich immer:Verwenden von mxGetPr vs mxGetData

Anzahl der gewünschten Objekte: = 0

Aber die myMEX_2.cpp funktioniert gut und zeigen die Anzahl eingegeben von MATLAB Befehlsfenster. Wo ist mein Fehler in myMEX_1.cpp?

Meine Umgebung: MATLAB R2013a und Microsoft SDK 7.1 Compiler.

// 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); 
} 

Antwort

3

mxGetData gibt einen void Zeiger, der auf einen Zeiger des richtigen Datentyp gegossen werden muss.

In C, mxGetData liefert einen void Zeiger (void *). Da void Zeiger auf einen Wert zeigen, der keine Art hat, werfen den Rückgabewert auf den Zeigertyp, der die Art von pm

In Ihrem Fall angegebenen übereinstimmt, ich gehe davon aus, dass, obwohl es aussieht wie du‘ In einem Integer übergeben, ist es eigentlich ein double da dies der Standard-Datentyp von MATLAB ist, so dass Ihr Problem auf die Tatsache zurückzuführen ist, dass Sie versuchen, es in einen unsigned short Zeiger zu konvertieren.

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

Um dies zu beheben, müssten wir die Ausgabe von mxGetData als double Zeiger statt und dann dereferenzieren, werfen sie und ordnen sie

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

mxGetPr ist das gleiche werfen wie mxGetDataaußer, dass es automatisch die Ausgabe von mxGetData als double Zeiger. Dadurch erspart man Ihnen einen Schritt, ist aber nur für double Eingänge (die Sie haben) geeignet.

Wenn Sie Eingaben mehrerer Typen entsprechend behandeln möchten, müssen Sie den Typ des Eingangs entweder mit mxIsDouble oder mxIsClass überprüfen.

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' gibt immer' * double' zurück, unabhängig vom Typ des Eingabearguments. – GntS

+0

@GmtK Ich dachte, dass ich das nur überprüft habe. Obwohl Ihr Code funktioniert, wenn Sie * wirklich * eine Ganzzahl übergeben: 'myMEX_1 (uint16 (1))' – Suever

+0

Der Funktionsprototyp wird in der MATLAB-Hilfe als 'double * mxGetPr (const mxArray * pm);' – GntS

Verwandte Themen