Array an Funktion übergeben



  • Hallo,

    sorry vorab - ich weiß diese Frage gab es bereits. Ich verstehe aber den Ansatz nicht und bräuchte hier noch ein wenig Unterstützung. Ich möchte ein mehrdimensionales Array übergeben, soweit so gut:

    #include <iostream>
    #define DIM1 5
    #define DIM2 5
    
    void out(int feld[DIM1][DIM2]) {
       int i, j;
    
       for(i = 0; i < DIM1; i++) {
          for(j = 0; j < DIM2; j++) {
    	 std::cout << feld[i][j];
          }
          std::cout << "\n";
       }
       std::cout << "\n";
    }
    
    int main() {
       int val[DIM1][DIM2];
       int i, j;
    
       for(i = 0; i < DIM1; i++)
          for(j = 0; j < DIM2; j++)
             val[i][j] = i+j;
    
       out(val);
       return 0;
    }
    

    Nun wird ja der Array kopiert und eine Kopie dessen bearbeitet. Optimal wäre ja lediglich die Adresse des Arrays zu übergeben, oder? Und hier ist mein Problem. Wie gehe ich das nun korrekter Weise an?

    Die Grundlagen der Zeiger habe ich verstanden, leider steige ich hier komplett aus. In Verbindung mit Arrays komme ich regelmäßig durcheinander.

    Gruß
    CPPEinsteiger



  • du übergibst automatisch die adresse. hier wird nicht kopiert.



  • Das Problem mit 2D-Arrays wird je jede Woche gefühlt 17-mal diskutiert. Bitte bemüh´ doch die Suchfunktion des Forums.



  • 12345 schrieb:

    du übergibst automatisch die adresse. hier wird nicht kopiert.

    super, vielen Dank 🙂



  • Statt den echten Arrays nutzt man in C++, genau um solche Fehler zu vermeiden, das Klassentemplate std::array . Das hat eine für C++ intuitivere Semantik als die echten Arrays.

    P.S.: Du musst hier nichts kopieren. Eine const -Referenz würde genügen.

    Und die Dimensionen eines lokal deklarierten Arrays über ein Makro zu definieren ist der Wahnsinn. Für sowas gibt es Templates:

    template<std::size_t N1, std::size_t N2>
    void out(int feld(const&)[N1][N2]) {
       // ....
    }
    

    Bzw. für ein verschachteltes std::array

    template<std::size_t N1, std::size_t N2>
    void out(std::array<std::array<int, N2>, N1> const& arr) {
       // ....
    }
    

    Ungetestet!



  • 12345 schrieb:

    du übergibst automatisch die adresse. hier wird nicht kopiert.

    Doch, die Adresse, is immerhin call-by-value...


Anmelden zum Antworten