2016-04-26 11 views
-1

Ich habe eine mex-Funktion geschrieben (in C), die 2 Arrays und einen Skalar als Eingabe benötigt und nach einer mathematischen Berechnung eine skalare Menge als Ausgabe zurückgibt. Ich kann die entsprechende mex-Funktion erfolgreich auf der MATLAB-Plattform kompilieren, aber sobald ich sie mit einigen Eingabedaten ausführen werde, verursacht dies einen Absturz von MATLAB. Das Fehlerprotokoll hat die Überschrift "Segmentierungsverletzung entdeckt am Montag, den 25. April: ..: .. 2016". Ich habe auch versucht, es in Linux-Plattform mit dem GNU-Debugger 'gdb' zu debuggen. Es zeigt ein Problem mit allen if-Anweisungen, die ich verwendet habe, um die Anzahl und den Typ von Eingabe-/Ausgabeargumenten zu überprüfen, die nrhs, prhs [], nlhs, plhs [] verwenden. Zum Beispiel ist meine erste Anweisung zum Überprüfen der Anzahl der Eingabeargumente Matlab stürzt beim Ausführen einer Mex-Funktion mit einigen Daten ab

und ebenfalls andere für nlhs

. Der GNU-Debugger platziert seinen ersten Haltepunkt an der obigen if-Anweisung, und wenn ich ihn auskommentiere, verursacht er ein Problem mit der zweiten if-Anweisung, die diesem und ähnlichem folgt. Wenn ich alle if-Anweisungen auskommentiere, läuft die mex-Funktion erfolgreich und gibt mir auch die gewünschte Ausgabe.

Es ist lange her, seit ich versuche, diesen Fehler zu entfernen, indem ich alle verfügbaren Antworten lese, aber ich bin nicht dazu in der Lage. Bitte helfen Sie mir mit dem obigen Problem. Vielen Dank im Voraus.

Unten ist der eigentliche Code:

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) 
{ 
    double *Ip, *Is;   /* Input data vectors */ 
    double r;    /* Value of r (input) */ 
    double *dist;   /* Output ImED distance */ 
    size_t ncols;   /* For storing the size of input vector */ 

    /* Checking for proper number of arguments */ 
    if(nrhs!=3) 
     mexErrMsgTxt("Error..Three inputs required."); 

    if(nlhs!=1) 
     mexErrMsgTxt("Error..Only one output required."); 

    /* make sure the first input argument(value of r) is scalar */ 
    if(!mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || mxGetNumberOfElements(prhs[0])!=1) 
     mexErrMsgTxt("Error..Value of r must be a scalar."); 

    /* make sure that the input vectors are of type double */ 
    if(!mxIsDouble(prhs[1]) || mxIsComplex(prhs[1]) || !mxIsDouble(prhs[2]) || mxIsComplex(prhs[2]))   
     mexErrMsgTxt("Error..Input vectors must be of type double.");  

    /* Make sure that the output is of type double and is a scalar */ 
    if(!mxIsDouble(plhs[0]) || mxIsComplex(plhs[0]) || mxGetNumberOfElements(plhs[0])!=1) 
     mexErrMsgTxt("Error..Image Euclidean Distance must be a scalar."); 

    /* check that number of rows in input arguments is 1 */ 
    if(mxGetM(prhs[1])!=1 || mxGetM(prhs[2])!=1) 
     mexErrMsgTxt("Error..Inputs must be row vectors."); 

    /* Get the value of r */ 
    r = mxGetScalar(prhs[0]); 

    /* Getting the input vectors */ 
    Ip = mxGetPr(prhs[1]); 
    Is = mxGetPr(prhs[2]); 

    ncols = mxGetN(prhs[1]); 

    /* Creating link for the scalar output */ 
    plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); 
    dist = mxGetPr(plhs[0]); 

    imedDistCal(r,Ip,Is,(mwSize)ncols,dist); 
} 
+1

Aus dem Fehlerprotokoll scheint es, dass Sie versuchen, auf geschützten, schreibgeschützten oder nicht zugeordneten Speicher zuzugreifen. Ich würde zunächst Schleifen und Indizes überprüfen. – ritualmagick

+1

Bitte zeigen Sie auch den tatsächlichen Code an. – rayryeng

+0

@rayryeng Bitte sehen Sie den tatsächlichen Code. – nagarwal

Antwort

0

Wie oben im Kommentar erwähnt, stürzt MATLAB, weil die mxWhateverFunction(plhs[0]) <-- fill in for whatever führt zu einer ungültigen Adresse, wenn plhs[0] irgendeine Variablen nicht verknüpft ist vor den Prüfungen.

Das folgende Stück Code

if(!mxIsDouble(plhs[0]) || mxIsComplex(plhs[0]) || mxGetNumberOfElements(plhs[0])!=1) 
     mexErrMsgTxt("Error..Image Euclidean Distance must be a scalar."); 

sollte verschoben werden, nachdem die folgenden dieses Problem zu vermeiden.

/* Creating link for the scalar output */ 
    plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); 
    dist = mxGetPr(plhs[0]); 
+0

Obwohl der Code jetzt gut läuft, stürzt er jedoch bei Eingabe-Arrays der Größe 1 X 1638400 ab, was innerhalb der Grenzen liegt.Ich habe auch versucht, es mit der Flagge-LargeArrayDims zu kompilieren, aber es ging vergebens. Können Sie bitte etwas Licht in dieses Thema bringen? – nagarwal

+0

Kannst du den Code von '' imedDistCal (r, Ip, Is, (mwSize) ncols, dist); '' so kann ich versuchen, den vollständigen Code zu kompilieren (z. B. Upload in Pastebin oder etwas ähnliches)? Schwer zu sagen, dass ich das nicht habe. – ritualmagick

+0

Ja..Ich habe meine eigentliche Frage bearbeitet. – nagarwal

Verwandte Themen