Mehrdimensionalen Vektor (dynamisch) erstellen??



  • Hallo!

    Ich bin auf der Suche nach einer Lösung, um einen mehrdimensionalen Vektor zu erstellen.
    Unten im Code, soll der Sinn etwas näher verdeutlicht werden. Leider funktioniert das irgendwie so nicht?!?
    Hat jemand eine Idee, wie ich bei Instanziierung eines neuen Objektes (hier:m), im Konstruktor der Klasse von diesem Objekt, einen Vektor erstellen kann.
    Bei mir gibt es immer den Fehler, dass die Grösse des Vektors konstant sein muss?? Im Beispiel ist doch aber tmp konstant. Schaut's euch einfach mal an...
    Vielen Dank!

    int main()
    {
    const int size;
    cin >> size;
    Matrix m(size);
    
    return 0;
    }
    
    class Matrix
    {
    private:
         int matrixSize;     
    public:
         Matrix(int);
         ~Matrix();
    
         //etc.
    };
    
    ///////////////////////////////
    Matrix::Matrix(int pSize)
    {
        matrixSize = pSize;
        const int tmp = matrixSize;
    
        int matrix[tmp][tmp];
    }
    
    //etc.
    


  • Hab das Ganze auch schon mal mit dynam. Erstellung probiert...
    So wäre das kein Problem...

    int matrix = new int[tmp];
    

    Mehrdimensional gibt's Probleme??

    int *matrix = new int[tmp][tmp];
    


  • leg in der klasse nen zeiger auf int an, und erstelle dann im konstruktor den vektor

    //klasse
    class Matrix
    {
    //...
    private:
        int*matrix;
    };
    
    Matrix::Matrix(int size)
    {
        matrix=new int[size*size];
    }
    
    Matrix::~Matrix()
    {
        delete [] matrix;
    }
    

    der zweidimensionale array wird intern auch nur als eindimensionaler array behandelt..

    mfg



  • Und wie würde es funktionieren, wenn ich den Vektor nicht dynamisch erstelle, also wie im obersten Code-Teil?? Warum funktioniert das nicht?

    class Matrix
    {
    private:
         int matrixSize;     
    public:
         Matrix(int);
         ~Matrix();
    
         //etc.
    };
    
    ///////////////////////////////
    Matrix::Matrix(int pSize)
    {
        matrixSize = pSize;
        const int tmp = matrixSize;
    
        int matrix[tmp][tmp];
    }
    
    //etc.
    


  • ...weil dann der vektor nur in der zeit, in der der konstruktor aufgerufen wird, existent ist, und nach dem konstruktoraufruf wieder "zerstört" wird

    die variable matrix würde dann nur als lokale variable gehandhabt werden, und diese lokalen variablen sind ja beim verlassen des blockes, wo sie definiert wurden, ungültig... 😉



  • Aber ich müsste doch irgendwie ein Objekt erstellen können, bei dessen Erstellung ein nicht dynamischer Vektor 'erstellt' wird und die Grösse dieses Vektor per Konstruktor übergeben wird, oder?

    Habe das nun mal nach deinem (_mika_) obigen Bsp. probiert. Der Vektor müsste nun mit 0 initialisiert werden. Geschieht auch, nur an gewissen Stellen schreibt er keine 0??
    Wir denn so wirklich der Vektor elementeweise initialisiert, irgendwo muss noch ein Fehler sein.

    Hier ein Auszug:

    class Matrix
    {
    private:
         long sizeOfMatrix;
         int *vecPtrMatrix; 
    public:
         Matrix(long);
         ~Matrix();
    
    //usw.
    }
    
    Matrix::Matrix(long size)
    {
        sizeOfMatrix = size;			
        vecPtrMatrix = new int[(sizeOfMatrix * sizeOfMatrix)];
    
        int *tmpVecPtrMatrix = vecPtrMatrix;
        long max =(sizeOfMatrix * sizeOfMatrix);
    
        cout << endl;
        for(long i = 0; i < max; i++)
        {
            tmpVecPtrMatrix += i;
            *tmpVecPtrMatrix = 0;	
        }
    }
    


  • Chris2005 schrieb:

    Aber ich müsste doch irgendwie ein Objekt erstellen können, bei dessen Erstellung ein nicht dynamischer Vektor 'erstellt' wird und die Grösse dieses Vektor per Konstruktor übergeben wird, oder?

    also wenn es eine möglichkeit dazu gibt, dann kenn ich diese nicht, sry, aber was hast du gegen dynamisch angelegte objekte??

    Chris2005 schrieb:

    for(long i = 0; i < max; i++)
        {
            tmpVecPtrMatrix += i;
            *tmpVecPtrMatrix = 0;    
        }
    

    -> ja, der fehler ist, dass du den zeiger zuerst um 0, dann 1, dann 2, dann 3...usw bewegst, also nicht jedes feld mitnimmst 😉

    schreib doch einfach:

    *tmpVecPtrMatrix=0; //weiß nicht, ob das so richtig ist, habs nicht getestet 
        for(long i=0; i < max/*-1*/; ++i) //kann auch nur bis max-1 gehn, nicht getestet
        {
            *(tmpVecPtrMatrix++)=0;
        }
    

    dann müsste das gehn 😃

    mfg



  • Ein Blick in die FAQ wirkt auch manchmal Wunder.



  • Habs auch gerade gesehen?!? Ok... sitze wohl schon etwas zu lange vor der Kiste!! Vielen Dank!


Anmelden zum Antworten