Matrix als Pointer übergeben



  • Hi,

    ein Array wird ja eigentlich ganz einfach so übergeben, oder?

    void Testklasse::testmethode(bool *testArr)
    {
    
    }
    
    int main()
    {
       bool testArray[10];
       Testobjekt.testmethode(testArray);
    }
    

    Aber wie schaut das ganze dann bei einer Matrix aus?

    Grüße,
    David


  • Mod

    Wie wäre es, nicht mit rohen Arrays herum zu hantieren und sich stattdessen eigene Datentypen zu definieren, wie es in C++ so schön einfach geht?



  • Das war jetzt nur nur ein Testcode, um das ganze zu veranschaulichen.

    Und warum sollte ich eigene Datentypen definieren, wenn ich ein bool-Array brauche?


  • Mod

    Velociraptor45 schrieb:

    Und warum sollte ich eigene Datentypen definieren, wenn ich ein bool-Array brauche?

    Warum nicht std::array<bool>? Das hat eine viel schönere Semantik als Arrays, weswegen solche Fragen wie hier sich gar nicht erst stellen. Außerdem hast du nach einer Matrix gefragt und es gibt in C++ keinen Basisdatentyp namens "Matrix". Genau für solche Fälle wurden nutzerdefinierte Datentypen erfunden.



  • Velociraptor45 schrieb:

    Das war jetzt nur nur ein Testcode, um das ganze zu veranschaulichen.

    Und warum sollte ich eigene Datentypen definieren, wenn ich ein bool-Array brauche?

    Weil deine testmethode zum beispiel keine ahnung hat wie groß das array ist das du ihr da gibst und sie deswegen wahrscheinlich wenig bis nix damit anfangen kann.

    (Eine) mögliche lösung für deine frage:

    #include <array>
    
    template <typename T, size_t N, size_t M>
    using Matrix = std::array < std::array<T, N>, M > ;
    
    int main() 
    {
        Matrix<double, 3, 3> matrix; // 3x3 Matrix vom typ double
        matrix[0][0] = 1.0; // Benutzen
    }
    


  • Die Empfehlungen, std::array zu nehmen, bzw. bei Bedarf einen eigenen Datentypen zu bauen möchte ich hiermit auch nochmal unterstützen 🙂

    Falls man jedoch trotzem mal mit Lowlevel-Arrays hantieren muss, deren Größe während des Kompilierens bekannt ist,
    kann es nicht Schaden zu wissen, dass Arrays eben keine dummen Pointer sind, sondern eine Größeninformation in sich tragen.
    Es ist ein Jammer wie oft man Code sieht, der das unter den Tisch fallen lässt:

    template <typename T, std::size_t N, std::size_t M>
    void print(const T (&a)[N][M])
    {
        for (std::size_t i = 0; i < N; ++i)
        {
            std::cout << ((i == 0) ? "{ " : ", ");
            for (std::size_t j = 0; j < M; ++j)
                std::cout << ((j == 0) ? "{ " : ", ") << a[i][j];
            std::cout << " }";
        }
        std::cout << " }" << std::endl;
    }
    
    ...
    
    int a[][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
    print(a);
    

    Finnegan



  • Danke euch.


Log in to reply