Mehrdimensionales Array an Funktion übergeben?



  • Hi, ich lerne C++ aus einem Buch und nun bin ich bei der übergabe von mehrdimensionalen Arrays an Funktionan angelangt.
    Im Buch gibt es leider nur ein Beispiel dazu und zwar folgendes:

    #include <iostream>
    
    using namespace std;
    
    const int DIM1 = 4;
    const int DIM2 = 3;
    
    void callmarray(int marray[][DIM2], int DIM1);
    
    int main()
    {
        int imarray[DIM1][DIM2];
        for(int i = 0; i < DIM1; i++)
        {
            for(int j = 0; j < DIM2; j++)
            {
                imarray[i][j] = i+j;
            }
        }
    
        callmarray(imarray, DIM1);
        return 0;
    }
    
    void callmarray(int marray[][DIM2], int DIM1)
    {
        for(int i = 0; i < DIM1; i++)
        {
            for(int j = 0; j < DIM2; j++)
            {
                cout << marray[i][j] << " ";
            }
            cout << endl;
        }
    }
    

    Das funktioniert einwandfrei aber wie kann ich die Anzahl der Zeilen und der Spalten des Arrays selbst eingeben, ohne vorher die 2 DIM-Konstanten zu deklarieren.
    Ich habe es folgendermaßen versucht:

    void marray( array[][elements], int dim1);
    

    Nur ist da das Problem ja eindeutig, das elements nicht deklariert ist
    (Sagt auch mein Compiler). Wie kann ich also die größe des Arrays an die funktion übergeben, wenn sie noch vor der Benutzereingabe nicht bekannt ist?
    Und wo kann ich die Variable elements in der Funktion deklarieren?

    Ich sage schonmal danke im voraus 🙂 :schland:



  • Geht nicht. Die Arraygröße muss zur Compilezeit bekannt sein.

    Es gibt in Boost eine Klasse, die diese Funktionalität zur Verfügung stellt: Boost.Multi-Array, aber wenn du gerade die Sprachgrundlagen lernst, ist das wahrscheinlich etwas hoch gegriffen.

    Ansonsten kannst du die Indizierung von Hand machen, etwa

    int *p = new int[dim1 * dim2];
    
    p[x * dim1 + y] = 0; // statt p[x][y]
    
    delete[] p;
    

    oder ein Zeiger-Array auf dem Heap verwalten:

    int **p = new int*[dim1];
    for(std::size_t i = 0; i < dim1; ++i) {
      p[i] = new int[dim2];
    }
    
    p[x][y] = 0;
    
    for(std::size_t i = 0; i < dim1; ++i) {
      delete[] p[i];
    }
    delete[] p;
    

    ...was natürlich die Speicherverwaltung verkompliziert. Das geht mit std::vector besser:

    std::vector<std::vector<int> > v(dim1, std::vector<int>(dim2));
    
    v[x][y] = 0;
    

    ...wenn du da schon angekommen bist.


Log in to reply