mehrdimensionales arrays mit new !?!



  • Hab leider ne allzheimer schwaeche bezueglich new auf mehrdimensionale arrays:

    folgendes liefert bei mir nen absturz:

    double w[][] = new double[3][3];
    

    werden nicht so dynamisch arrays alloziert?

    danke.



  • Was meinst du mit abstürzen? Kompiliert es überhaupt? Wenn nicht, dann probier folgendes:

    double **w = new double[3][3];
    


  • nee das funzt net, compiler sagt er kann der linken seite (double *) nicht einen Wert (double)[] zuweisen.

    ich moechte nur wissen wie man dynamisch eine MxN Matrix erzeugt mit new (ohne malloc oder old-school-C) macht?!

    Danke.





  • also:

    int** array;
    array = new int*[n];
    for(int i = 0; i < n; i++)
      array[i] = new int[m];
    
    // wieder freigeben:
    for(int i = 0; i < n; i++)
      delete [] array[i];
    delete [] array;
    


  • das nenne ich ne antwort 🙂
    -kurz
    -knackisch
    -schnell und jut

    es funzt.

    danke.



  • Das gleiche steht im übrigen auch in der Faq sehr schön erklärt, in Zukunft einfach
    öfter mal dort rein schauen 🙂



  • SirLant schrieb:

    Das gleiche steht im übrigen auch in der Faq sehr schön erklärt, in Zukunft einfach
    öfter mal dort rein schauen 🙂

    Das ist genau das was ich oben gemeint habe, mit dem entsprechenden Link 🙂

    peperonee schrieb:

    das nenne ich ne antwort 🙂
    -kurz
    -knackisch
    -schnell und jut

    es funzt.

    danke.

    Damit war ich ja hoffentlich ich gemeint 😃 😃 😃



  • Entyl_Sa schrieb:

    SirLant schrieb:

    Das gleiche steht im übrigen auch in der Faq sehr schön erklärt, in Zukunft einfach
    öfter mal dort rein schauen 🙂

    Das ist genau das was ich oben gemeint habe, mit dem entsprechenden Link 🙂

    Weiß ich doch, wollte es nur nochmal in direkten Worten ausdrücken 🤡



  • Was ist damit?

    double (*w)[3] = new double[3][3];
    


  • Geo schrieb:

    Was ist damit?

    double (*w)[3] = new double[3][3];
    

    Das ist nur zur hälfte dynamisch.



  • ich könnte ein paar helper vorschlagen

    const size_t marr(size_t spalten_pro_zeile, size_t zeile, size_t spalte)
    {
        return spalten_pro_zeile * zeile + spalte;
    }
    
    double * array = new double[3*3];
    
    array[marr(3, 1, 1)] = 10; // array[1][1] = 10;
    

    wenn man noch ein functor baut dann kann man sich die 3 sparen

    class marr
    {
    public:
        marr(size_t spalten_pro_zeile)
         :spalten_pro_zeile_( spalten_pro_zeile )
        {
        }
    
        const size_t operator()(size_t zeile, size_t spalte) const
        {
            return spalten_pro_zeile_ * zeile + spalte;
        }
    private:
        const size_t spalten_pro_zeile_;
    };
    
    //und dann
    marr dim(3); 
    
    double * array = new double[3*3];
    
    array[dim(1, 1)] = 10; // array[1][1] = 10;
    

    aber dann fragt man sich wieso man nicht gleich ein container benutzt

    und noch ein verbesserungs vorschlag

    int** array = new int*[n];
    int * tmp = new int[n*m];
    for(int i = 0; i < n; i++)
      array[i] = &tmp[m * n];
    
    // wieder freigeben:
    
    delete [] array[0];
    delete [] array;
    

    das spart n-1 new und delete aufrufe und der speicher ist an einen block!


Anmelden zum Antworten