Mehrdymensionales Array dinamisch erstellen



  • Warum funktioniert das nicht?

    #include <iostream>
    
    void function(int x) {
    	int* p=new int[x][x];
    }
    
    int main()
    {  
    	function(2);
    
    	return 0;
    }
    

    Wenn es eindimensional ist, geht's, aber so...

    Wie soll ich das machen? (bitte nicht zu vector raten, dass darf ich aus anderen Gründen nicht benutzen...)



  • Sieh mal in der C++ FAQ nach, da steht was dazu!



  • auf den Punkt gebracht: das geht in c++ net! Die größe Mehrdiemensionaler Arrays muss zur compilezeit bekannt sein! Aber du kannst das emulieren! Indem du dir ne Klasse schreibst, die mit eindimensionalen Arrays arbeitet!
    Ein ansatz: (keine Garantie auf richtigkeit, aber ungefähr so müsste es gehen)

    Template<class T>
    class multivector
    {
        private:
        const **T;                //Da packst du die Zeiger rein
        const *T;                 //Und hier die Werte
        public:
        multivector(int dim);
        ~multivector();
        bool setsizeofdim (int dim, int size);
        t& operator[] (int index);
    };
    

    Du arbeitest einfach nicht mit mehrdimensionalen Arrays, sondern mit einem Array aus Zeigern (von denen einige auf andere Zeiger in dem selben Array zeigen)
    wissen musst du nur, das es keinen Operator[][] oder so gibt! Das ist dann in wirklichkeit sowas wie: ((operator [](int))operator[](int) Oder so!
    Hoffe das ist verständlich! (Wenn ich dir einen Tipp geben darf: Wenn es geht würde ich auf multiarrays verzichten, das Zeug ist sehr kompliziert zu implementieren!)



  • int **p=new int*[dim1];
    for (int i=0; i<dim1; i++) p[i]=new int[dim2];
    
    //deleten:
    for (int i=0; i<dim1; i++) delete[] p[i];
    delete[] p;
    

    Zuerst erzeugst du die erste Dimension, dann bei jedem Index die zweite.
    Beim löschen genau umgekehrt, zuerst deletest du jeden Index und dann den Pointer p;



  • @randa
    Deine Lösung ist alles andere als gut, da du deinen Speichermanager ziemlich misshandelst.



  • so macht man das aber eben



  • Aber nur dann, wenn man nicht weiss, wie man's besser machen kann. Für kleine Dimensionen mag das ja ok sein, aber sobald es richtig gross wird (zB 1000 oder mehr), ist das alles andere als toll.



  • groovemaster schrieb:

    Aber nur dann, wenn man nicht weiss, wie man's besser machen kann. Für kleine Dimensionen mag das ja ok sein, aber sobald es richtig gross wird (zB 1000 oder mehr), ist das alles andere als toll.

    im endeffekt machts std::vector auch nicht anders.

    es gibt halt in c++ keine gute möglichkeit mehrdimensionale arrays zu simulieren, array[(Zeilen-1)*Spalte+Spalte] ist da auch keine lösung, sieht höchstens unschön im code aus und ist mieserabel zu wrappen...


Anmelden zum Antworten