Abstürze bei Einbindung einer dll im Fremdprogramm zur Bildverarbeitung



  • Hallo !
    Ich brauche dringend eine Lösung, hab daher NICHT tagelang Zeit ob ich das Problem bei anderen wiederfinde. Bitte daher um Verständnis...

    Ich versuche eine dll um eine eigene Funktion zu erweitern (Quellcode liegt vor und funzt unter debugmode wenn ich den code unter Visual c++ in dnet ändere).
    Hab einfach das Gerüst einer bestehenden Funktion kopiert und die dazugehörigen Resourcen verdoppelt usw, anschließend angepasst. Die neu compilierte dll funktioniert mit einer Platzhalter-Funktion die ein übergebenes Bild einfach invertiert und an Neurocheck zurückgibt.

    Aber bei meinem eigenen Code ist irgendwo ein Fehler der im Debug und beim Compilieren NICHT angezeigt wird aber das Programm Neurocheck abstürzen lässt.
    Um das Problem einzugrenzen habe ich alles auskommentiert und die einzelnen Zeilen einzeln durchgenommen durch wiederholtes compilieren. Warum ist folgender Block absturzgefärdet ????

    for (unsigned int ui = 0; ui < uiPoints; ui++)
    		{
    		    x = 1 + (ui / (Height-Rand));
    		    y = 1 + (ui % (Height-Rand));
    		    ImageField->pbyGrayValue[x][y] = (double) psImage->pbyGrayValue[ui];
    		    psImage->pbyGrayValue[ui] = (255 - psImage->pbyGrayValue[ui]); //platzhalterfunktion (FUNKTIONIERT)
    			}
    

    Ist es die explizierte Typkonvertierung oder wird div mod nicht richtig durchgeführt und ich bin ausserhalb der erlaubten Indexierung von [x][y] ??

    Hier noch die Definitionen und Declarationen:

    // *** Originalvalue- double array ***
    typedef struct
    {
    	// data
    	unsigned int				uiWidth;
    	unsigned int				uiHeight;
    
    	BOOL						bColor;
    
    	double**					pbyGrayValue;
    	double**					pbyRedValue;
    	double**					pbyGreenValue;
    	double**					pbyBlueValue;
    
    	int							iSource;
    	LPCTSTR						lpszSourceName;
    }
    	DOUBLEARRAY_OFIMAGE;					// grayvalue image
    
    DOUBLEARRAY_OFIMAGE *ImageField = new DOUBLEARRAY_OFIMAGE; // = new DOUBLEARRAY_OFIMAGE;
    

    Hab ich eventuell die Datenfelder falsch aufgebaut? Mit statisch und dynamisch komm ich immer wieder durcheinander.. Die einzelwert-Variablen funktionieren nämlich..

    DANKE !!!



  • Falsches Forum: Hier ist C++/CLI und nicht C++.



  • theta schrieb:

    Falsches Forum: Hier ist C++/CLI und nicht C++.

    Aber dotnet ist doch hier...
    Hab kein passsenderes Forum gefunden.
    Es geht ja auch nur um diese Deklaration.
    Was ist daran falsch???

    Danke !!



  • Das "1 + " bei x und y scheint nicht richtig zu sein, da Arrays immer null-indiziert sind.
    Auch erscheint mir (Height-Rand) etwas eigenartig. Sollte es nicht eher 'Width' sein, oder sind deine Bilder spaltenweise aufgebaut (anstatt zeilenweise)?

    Hast du denn außerdem auch noch Speicher für dein 'ImageField' und die darin enthaltenen Member reserviert?



  • Th69 schrieb:

    Das "1 + " bei x und y scheint nicht richtig zu sein, da Arrays immer null-indiziert sind.
    Auch erscheint mir (Height-border) etwas eigenartig. Sollte es nicht eher 'Width' sein, oder sind deine Bilder spaltenweise aufgebaut (anstatt zeilenweise)?

    Hast du denn außerdem auch noch Speicher für dein 'ImageField' und die darin enthaltenen Member reserviert?

    Hallo !
    Das Array muss einen Rand der Breite 1 haben, damit ich später die Bilddaten ohne Randwertproblem zB ableiten kann.
    D.H. mein 2D-Array ist immer n+1m+1 gross. Die Wertkopierung erfolgt also von Index ui zu spalte=index/ Höhe und zeile = index mod Höhe.
    (Ich hab mir vorher eine Bildinvertierungsfunktion angeschaut die einfach die Reihenfolge des 1d-Index ui vertauscht. Dabei wird aus "unten rechts" "Links oben". Daraus habe ich geschlossen dass die bitmap-structure in Spalten der Länge Höhe indexiert ist also [Spalte1,spalte 2 usw] = [0,1,2...w
    h-1].

    Ich habe nur eine Instanz angelegt:

    DOUBLEARRAY_OFIMAGE *ImageField = new DOUBLEARRAY_OFIMAGE;
    

    WIE muss ich denn jetzt den speicher zb für double** allocieren ?
    Wie gesagt ich bin mit dynamischen deklarationen nicht besonders vertraut..

    etwa so ?? :

    ImageField->pbyGrayValue = new double[Width][Height]
    

    So würde es etwa in c# aussehen.
    Aber in c++ ??

    Keine Ahnung.

    MFG Torsten



  • Ok, also doch die Speicherallokation -)

    Da du den Typ "double **" ja leider nicht ändern kannst, mußt du für diesen dann von Hand Speicher erzeugen, d.h. du hast kein wirkliches zweidimensionales Array, sondern einen "Zeiger auf ein Feld von Zeigern auf double".

    So in etwa dann:

    pbyGrayValue = new double*[Width];
    for(int i=0; i<Width; i++)
      pbyGrayValue[i] = new double[Height];
    

    Entsprechendes dann für die anderen Zeiger auch (am besten als Funktion definieren).

    Der Compiler kümmert sich dann aber um den korrekten Zugriff, wenn du 'ImageField->pbyGrayValue[x][y]' verwendest.

    P.S: Und zum Freigeben dann entsprechend

    for(int i=0; i<Width; i++)
      delete[] pbyGrayValue[i];
    
    delete[] pbyGrayValue;
    

Anmelden zum Antworten