Matrix reservieren



  • Guten Abend! (:
    Ich möchte ein Programm schreiben welches mir mit der Funktion reservieren eine x Zeilen y Spalten große Matrix reserviert und möchte diese dann beschreiben. Nach stundenlangen probieren mit Zeigern, Zuordnungen und anderem wende ich mich nun an euch. Hier drucke ich den Code ab:

    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    
    template <typename T>
    void einlesen(T **feld, int zeilen, int spalten)
    {
        for(int i=0; i<zeilen; i++)
        {
            cout<<"Bitte "<<zeilen<<". Zeile der Matrix eingeben: "<<endl;
            for(int j=0; j<spalten; j++)
            {
            cin>>feld[i][j];
            }
        }
    }
    
    template <typename T>
    void reservieren(T **feld, int zeilen,int spalten)
    {
        feld= new T*[zeilen];
        for(int i=0; i<zeilen; i++)
        {
            feld[i] = new T[spalten];
        }
    }
    

    Das waren die Funktionen, nun kommt meine main darunter

    int main()
    {
        int zeilen, spalten;
        cout <<"Anzahl Zeilen: ";
        cin >> zeilen;
        cout <<"Anzahl Spalten: ";
        cin >> spalten;
    
        int  **Mi;
        reservieren(Mi, zeilen, spalten);
        einlesen(Mi, zeilen, spalten);
    

    Die main durfte laut Aufgabe nicht verändert werden und die Matrix muss auch double (oder andere) einlesen können, daher das template. Ich benutze C++ 11.

    Achja, als Fehler bekomme ich immer ein Segmentation Fault.

    Ich hoffe ihr könnt mir helfen

    MfG
    Oli 🙂



  • Guck dir Zeile 23 an. Dein genewter Speicher wird auch nirgends deletet. Bei sowas sind Dinge wie std::vector das richtige.



  • Ich denke, Du bist schon ziemlich dicht an dem, was von Dir als Lösung erwartet wird.

    Allerdings müsstest Du Mi aus main() verändern. Also eine Referenz nehmen:

    template <typename T>
    void einlesen(T **&feld, int zeilen, int spalten);
    
    template <typename T>
    void reservieren(T **&feld, int zeilen,int spalten);
    

    😮



  • Furble Wurble schrieb:

    Ich denke, Du bist schon ziemlich dicht an dem, was von Dir als Lösung erwartet wird.

    Allerdings müsstest Du Mi aus main() verändern. Also eine Referenz nehmen:

    template <typename T>
    void einlesen(T **&feld, int zeilen, int spalten);
    
    template <typename T>
    void reservieren(T **&feld, int zeilen,int spalten);
    

    😮

    Bei der einlesen Funktion ist die Referenz eigentlich nicht nötig, da der feld Pointer gar nicht verändert wird.



  • sebi707 schrieb:

    Bei der einlesen Funktion ist die Referenz eigentlich nicht nötig, da der feld Pointer gar nicht verändert wird.

    Stimmt auffällig. (Bitte keine "const ref auf const Zeiger auf..."-Witze hier einfügen!) 😉


Anmelden zum Antworten