Kompilierung meines C++/MEX-Files funktioniert nicht - "Segmentation Violation"



  • Das mache ich grundsätzlich! Bei mir wächst kein Array in einer Schleife! 😉

    Außerdem ist die Idee ja sogar, das später mal für das komplette zu registrierende Bild zu machen. Momentan wird ja nur der Teil transformiert, der dann auch über dem Referenzbild liegt, der Rest wird einfach ignoriert (und damit quasi weggeschnitten).

    Das hatte ich dann auch mal probiert, aber dann abgebrochen, als ich festgestellt habe, dass das sogar etwa 10 Stunden gedauert hätte...



  • MSCHMITT schrieb:

    Aufgerufen wird das Programm nun wie folgt:

    [TransformiertesBild] = trans_affine(ReferenzBild, ZuRegistrierendesBild, Parameter);
    

    Dafür hätte ich eben gerne Daten gehabt, damit ich das mal ausprobieren kann. Crasht dein Programm auch für irgendeine kleine Datenmenge?

    ich hab das programm mal so umgeschrieben, dass es durch den mitgebrachten lcc-c-compiler geht (alle variablen am anfang deklarieren und exception und namespace raus) und dann konnte ich den fehler mit zwei minuten aufwand nicht reproduzieren.

    dafür hat die vmware meinen tastaturtreiber geschrottet. hmm.



  • Meine konkreten Daten kann ich leider nicht rausrücken, weil die unter Verschluss stehen.

    Parameter könnte z.B. so aussehen:

    Parameter = [5, 10, 0.95, 1.0, pi/2, pi/2];
    

    Und die beiden Eingangsmatrizen können theoretisch beliebige Matrizen sein (Werte sind ja für Code-Funktionalität egal, werden ja nur umgesetzt), zum Beispiel 300 x 300 oder so.



  • Habs grade mal ausprobiert, mit zwei 300 x 300 Matrizen und den oben angegebenen Parametern. Da läufts tatsächlich durch. Das könnte die Fehlerquelle für erfahrene C++-User deutlich eingrenzen, oder?



  • Naja, deine Fehlermeldung liest sich nach "über Arraygrenze rausgeschrieben", aber das schließt deine if-Bedingung eigentlich aus, soweit ich das sehe (iTrans ist RowsR*colsR breit und It ist rowsT*colsT groß). Danach vermute ich eine Division durch 0 bei dem cos-Termen, aber das sollte eigentlich ne andere Fehlermeldung geben. Und danach dann die ganzen Matlab-Geschichten: die Typen stimmen teilweise nicht ganz rowsR usw. sollten keine ints sondern mwSize oder sowas sein. Vielleicht wird eine der Größen irgendwann negativ, aber da müssten deine Matrixen schon größer als 5000x5000 werden, schätz ich.

    Und als letzte Ursache ein "Problem im System". Ist das Visual Studio korrekt für Matlab konfiguriert? Wie gesagt, ich hab nur den LCC zur Hand, kann das also schlecht testen. Vielleicht mag Matlab zB. den C++-Overhead nicht besonders. Muß der vielleicht irgendwie C-kompatibel linken? (Ich hab auch nicht die aktuelle Matlab-Version, sondern irgendwas altes)

    Das sind ein paar Sachen, über die ich mir Gedanken machen würde und die man systematisch ausschließen nacheinander kann. Wenn das nicht hilft, tja, http://www.mathworks.com/support/tech-notes/1600/1605.html#gen_debugging



  • Danke nochmal für die Hilfe!

    Den von dir geposteten Link habe ich natürlich schon vor meinem Post hier gelesen, will ja den Leuten nicht grundlos ihre Zeit stehlen. 😉

    Hab den Code jetzt mal soweit abgeändert, wie du das vorher beschrieben hast, damit ich das auch mit dem LCC kompilieren kann:

    #include "matrix.h"
    #include "mex.h"
    #include "math.h"
    
    int round(double value);
    
    int round(double value)
      {
      return (int)floor( value + 0.5 );
      }
    
    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
    {
    
        mxArray *mIr, *mIt, *mparam;
    	double *Ir, *It, *param, *ITrans;
        int rowsR, colsR, rowsT, colsT, rn, cn;
    	double pixel_size, x0, y0, mx, my, alpha, beta, X0, Y0, xr, yr, xt, yt, r, c, i0, j0, r0, c0;
    

    Sprich: namespace raus, exception raus, Variablendeklaration komplett am Anfang (außer in den for-Schleifen).

    Trotzdem haut der mir jetzt immer noch ne Menge Fehlermeldungen raus:

    Error E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 13 redeclaration of mexFunction' previously declared at D:\\MATLAB~1\\extern\\include\\mex.h 135 Error E:\\Studium\\FERNERKUNDUNG\\Diplomarbeit\\Matlab\\trans\_affine\\trans\_affine\\trans_affine.cpp: 48 syntax error; found \int' expecting `;'
    Error E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 48 syntax error; found `int' expecting `;'
    Error E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 48 syntax error; found `int' expecting `)'
    Error E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 48 skipping int' Error E:\\Studium\\FERNERKUNDUNG\\Diplomarbeit\\Matlab\\trans\_affine\\trans\_affine\\trans_affine.cpp: 48 undeclared identifierj'
    Warning E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 48 Statement has no effect
    Warning E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 48 unreachable code
    Error E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 48 syntax error; found )' expecting;'
    Error E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 48 illegal statement termination
    Error E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 48 skipping )' Error E:\\Studium\\FERNERKUNDUNG\\Diplomarbeit\\Matlab\\trans\_affine\\trans\_affine\\trans_affine.cpp: 50 syntax error; found \int' expecting `;'
    Error E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 50 syntax error; found `int' expecting `;'
    Error E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 50 syntax error; found `int' expecting `)'
    Error E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 50 skipping int' Error E:\\Studium\\FERNERKUNDUNG\\Diplomarbeit\\Matlab\\trans\_affine\\trans\_affine\\trans_affine.cpp: 50 undeclared identifieri'
    Warning E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 50 Statement has no effect
    Warning E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 50 unreachable code
    Error E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 50 syntax error; found )' expecting;'
    Error E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 50 illegal statement termination
    Error E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 50 skipping `)'
    Error E:\Studium\FERNERKUNDUNG\Diplomarbeit\Matlab\trans_affine\trans_affine\trans_affine.cpp: 71 illegal continue statement
    18 errors, 4 warnings

    Was stört ihn denn da jetzt noch?! Vor allem komisch das mit der Redeclaration?!



  • Hmm, i und j kann man in C nicht direkt in der Schleife anlegen, sondern müssen auch an den Blockanfang. i0 und j0 und so hättest Du in der Schleife stehen lassen können, Du kannst in C -- wenigstens der alten, hier geforderten Version -- immer nur am Blockanfang, also nach einer '{' Variablen anlegen.



  • Ja, das ist mir mittlerweile auch klar geworden. Nachdem ich das bereinigt habe, sind alle Fehlermeldungen weggefallen - bis auf die erste:

    ...\trans_affine.c: 13 redeclaration of `mexFunction' previously declared at D:\MATLAB~1\extern\include\mex.h 135

    Und die verstehe ich beim allerbesten Willen nicht. 😕

    EDIT: Hab mir natürlich mex.h mal zu Gemüte geführt, aber ich wüsste jetzt nicht, wo ich in Zeile 13 mexFunction redeklariere?!



  • Mach mal aus 'mxArray *prhs[]' ein 'const mxArray *prhs[]'.



  • Ändert leider nichts. 😞



  • Das ist seltsam, weil ich bekomm (mit R2007a) ohne const genau deinen Fehler. Und mit dem korrekten const vor dem letzten Parameter gehts durch.



  • Hatte das .c-File im MATLAB-Editor geöffnet und verändert, da hat er gebugt und die Änderung nicht abgespeichert. Extern konnte ich's dann ändern und jetzt funktioniert's!

    Ganz herzlichen Dank für die Hilfe, das war mein Einstieg ins C-/MEX-Programmieren.

    Jetzt muss ich nur noch dafür sorgen, dass er auch bei großen Matrizen nicht mehr aussteigt (was er derzeit noch tut).



  • EDIT: War falsch!


Anmelden zum Antworten