Mehrdimensionale Arrays an Zeiger übergeben???



  • @THE_FreaK

    Danke das du meine Frage wiederholst.

    😡
    Für folgende zwei Zeilen suche ich unter C++ noch bessere Formulierungen.

    ptest = &test[0][0];  
    *(ptest+i*3+j) und nicht *(ptest[i][j])
    

    😡

    Jetzt meine blöde Antwort: Anderfalls compilerts und funktionierts nicht

    Blöde Antwort deshalb weil ich keine Erklärung habe.

    @Dennis danke für die Antwort, hast du für das zweite auch noch was



  • Warum macht ihr nicht einfach so was in der Art?

    template<typename T>
    T** alloc2d(unsigned cx, unsigned cy)
    {
      T** ppt = new T*[cx];
      for(unsigned i = 0; i < cy; ++i)
        ppt[i] = new short[cy];
      return ppt;
    }
    
    int main()
    {
      short** pps = alloc2d<short>(10, 10);
      pps[9][9] = 10;
      return 0;
    }
    


  • Für

    short test[5][3];
    short* ptest = &test[0][0];   
    *(ptest+i*3+j)
    

    müsste man auch das hier schreiben können:

    short test[5][3];
    short *ptest = reinterpret_cast<short*>(test); // hier wird ein mehrdimensionales Array zu einem Pointer gecastet.
    ptest[i*5+j];// oder: (i*5+j)[ptest];
    

    Zumindest funzte der Code mal bei mir (auch wenn er nich hübsch is).



  • @MaSTaH Danke für die C++ Lösung

    Das war mein erster Beitrag zu diesem Thema:

    In C übergebe ich den Pointer auf das erste Element sprich [0][0]..[0],
    den Rest kann ich mir in der Funktion berechnen, Notfalls mus ich die einzelnen Dimensionen übergeben.

    Vielleicht gibt es in C++ dafür einen moderneren Weg

    Habe auf grund meines Wissens nur eine sinnvolle C lösung anbieten können und gehoft das ein C++ Beispiel auch noch kommen würde.



  • @DennisB

    Interessant wäre hier eine Lösung mit getrennten Dimensionen, so das ich die Position im Vektor nicht selber ausrechenen muss



  • Wenn man die multidimensionalen Arrays als einfachen Array behandeln will, muss man schon selbst rechnen lassen.



  • Was ich als Anmerkung bei meinem Vorschlag vegessen habe: Der Speicher ist dann AFAIK nicht zwangsläufig an einem Stück.



  • 🙂 Was man teilweise als Nachteil sehen muss, wenn man so ein feld effektiv und schnell über pointer mathematisch bearbeiten will 🙂



  • Ok, ich muss mich wol damit abfinden es selbst immer zu errechnen. Aber wieso ist das so, muss doch einen Grund geben oder



  • Guck doch mal in die FAQ. Da steht soweit ich weiß auch ein laaanger Artikel von Dimah zu dem Thema drin 😉 .



  • @ MaSTaH Danke, jetzt ist mir einiges klarer geworden, trotzdem finde ich die erklährung wieso:

    [quote]Den Zeiger auf ein zweidimensionales Array zeigen lassen.
    Wichtig: Die zweite Dimension muss mit der Array-Größe
    übereinstimmen, mit der der Zeiger deklariert wurde
    pArr = new int [5][2]; wäre z.B. illegal, da ein Zeiger auf ein
    Array mit 5 Elementen nicht in einen Zeiger auf ein Array mit
    2 Elementen konvertiert werden kann.
    [quote]
    nicht gerade die beste, da eien Array ja auch nur ein pointer auf den ersten Wert ist und somit auch illegal wäre (bleibt wohl für immer ein Mysterium


Anmelden zum Antworten