Werte von Member Variable werden falsch gelesen



  • Hallo zusammen,

    es wäre super, wenn mir jemand von euch einen Tipp geben könnte, wo mein Problem liegt.

    Ich habe eine Vector-Klasse, die von der AbstractVector-Klasse erbt und deren gemeinsame .h-Datei folgendermassen aussieht:

    class AbstractVector {
    protected:
        int rows;
        int cols;
    }
    
    class Vector : public AbstractVector {
    public:
        Vector fit2DToVector(T** hostPtr, int noOfRows, int noOfCols);
        T** getHostPointer2D(T** newPtr = NULL);
    
    protected:
        void copyData();
    }
    

    In der Vector.hpp-Datei ist die fit2DToVector(...) wie folgt:

    Vector fit2DToVector(T** hostPtr, int noOfRows, int noOfCols){
        this->rows = noOfRows;
        this->cols = noOfCols;
        [...]
    }
    

    In den Funktionen copyData() und T** getHostPointer2D(...) wird lesend auf die Variablen rows und cols zugegriffen (immer mit this->rows und this->cols). Ich habe sehr oft nachgeschaut, ich kann nirgendwo einen schreibenden Zugriff entdecken.

    Wenn die Methode fit2DToVector(2DPointer, 550, 413) aufgerufen wird, sollen diese Werte in den member Variablen gespeichert werden.

    Das funktioniert auch in der Funktion copyData(). Dort wird lesend auf die Variablen zugegriffen und diese liefern den korrekten Wert.

    In der Funktion getHostPointer2D(...) wird ebenfalls lesend auf die beiden Variablen zugegriffen. Allerdings werden hier wirre Werte gelesen.

    Zu dem Zeitpunkt des Lesens in der getHostPointer2D(...)-Funktion gibt es nur ein Vector-Objekt. Allerdings soll es später mehrere geben, die eine unterschiedliche Zahl an rows und cols haben können. Daher kann ich die Variablen nicht static machen (das habe ich versucht, dann werden die korrekten Werte gelesen).

    Es wäre super, wenn mir jemand sagen könnte, warum in der einen Funktion seltsame Werte gelesen werden. Sollten noch weitere Informationen nötig sein, poste ich diese gerne.

    Gruß,



  • Zeig doch mal die Anwendung? Ansonsten sieht es etwas seltsam aus, daß die fit2DToVector() einen Vektor zurückliefern will, aber die Member von this ändert.



  • Die komplette Anwendung kann ich leider nicht zeigen, da es sich um eine Bibliothek handelt, was den Rahmen hier sprengen würde.

    Aber vielleicht hilft die ganze fit2DToVector-Funktion?!?

    template<typename T>
    Vector<T> Vector<T>::fit2DToVector(T** hostPtrs, int noOfRows, int noOfCols) {
    
    	this->rows = noOfRows;
    	this->cols = noOfCols;
    	size_t noOfElements = noOfCols * noOfRows;
    	size_t size = noOfElements * sizeof(T);
    	T* newPtr = (T*) malloc(size);
    
    	int i, j;
    	for (i = 0; i < noOfRows; i++) {
    		for (j = 0; j < noOfCols; j++) {
    			newPtr[(i * noOfCols) + j] = hostPtrs[i][j];
    		}
    	}
            //Namespace, um die Dimension festzuhalten
    	this->vecIs2D = Dimension::Two;
    	return Vector<T> (newPtr, noOfElements);
    }
    

    Vielleicht hilft es noch zu sagen, dass am Ende der Konstruktor von der Vector-Klasse aufgerufen wird, und dann dieser Vector zurückgegeben wird. Im Konstruktor gibt es keinerlei Informationen über rows oder cols.



  • Ich meinte, du sollst mal zeigen, wie diese Funktion aufgerufen wird. Auf jeden Fall spielen in dieser Funktion zwei Vektoren mit - this merkt sich die beiden Größenangaben, aber der Rückgabewert der Funktion bekommt nur die Gesamtanzahl der Elemente an den Konstruktor übergeben.

    (außerdem halte ich die Art, wie du mit dem Speicher umgehst, etwas bedenklich)



  • Also deine Klassen möchte ich nicht verwenden müssen. So ein hässliches C-like Interface kombiniert mit Templates. 😮

    Noch dazu Manuelle Speicherverwaltung (noch dazu mit malloc!) und keine STL-Algorithmen.

    Pfui-Bäh!



  • Die Methode wird so aufgerufen:

    Vector<float> input = input.fit2DToVector(img.imageMatrix, noOfRows, noOfCols);
    

    Was ist an dem Umgang mit dem Speicher denn verbesserungswürdig?


Log in to reply