Dynamisches Mehrdimensionales Array



  • du kannst genauso vector<vector<vector<int>>> machen. Dann hast du unterschiedliche Längen. Spart dir die überflüssigen struct-Wrapper.



  • Ich find die hier nicht überflüssig sondern notwendig um auszudrücken mit was man da eigentlich arbeitet.

    Wie würdest du dein vector<vector<vector<int>>> denn nennen? Ein Bezeichner wie rooms passt hier ja nicht wirklich, warum sollte rooms[0][0] eine Sitz-Reihe sein oder rooms[0][0][0] ein Sitzplatz? Das fände ich ziemlich verwirrend zu lesen.

    Außerdem musst du es sowieso so machen wenn ein raum etwa mehr als nur eine Ansammlung an Objekten hat (zum Beispiel Fenster, Türen, etc.). In Sachen Lesbarkeit und Erweiterbarkeit finde ich das so schon besser.

    Man kann sich ja immer noch hilfs-Methoden schreiben die es einem abnehmen die Kaskade an Objekten durchzugehen:

    /* ... */
    
    struct haus { 
        std::vector<raum> raueme; 
        int &sitzplatz(int raum_nr, int sitzreihen_nr, int platz_nr) { 
            return raueme[raum_nr].reihen[sitzreihen_nr].sitzplaetze[platz_nr].nummer; 
        }
    };
    
    int main()
    {
        haus mein_haus;
        /* ... */
        mein_haus.sitzplatz(0, 1, 2) = 3; // Raum 1, Reihe 2, Platz 3
    }
    

    Zumindest sieht man so dass es um einen Sitzplatz geht.



  • Oder schlichter

    typedef int sitzplatz;
    
    typedef sitzplatz sitzreihe[5];
    
    typedef sitzreihe raum{5];
    
    typedef vector<raum> haus;
    

    //dachte, die 5x5-Räume seien so in der Aufgabe vorgegeben.



  • happystudent schrieb:

    mein_haus.sitzplatz(0, 1, 2) = 3; // Raum 1, Reihe 2, Platz 3
    

    Oder auch einfach

    mein_haus.sitzplaetze[0][1][2] = 3;
    


  • volkard schrieb:

    Oh, Typen mit Bedeutung! Ob man da was draus machen kann?

    Hm, ich bin mir gerade nicht sicher ob das Sarkasmus ist 😃

    zirkelschluss schrieb:

    Oder auch einfach

    mein_haus.sitzplaetze[0][1][2] = 3;
    

    Ja nee, dann könnte man ja auch gleich vector<vector<vector<int>>> nehmen... Warum soll ein Sitzplatz was 3-dimensionales sein? Was ist dann mein_haus.sitzplaetze[0] oder mein_haus.sitzplaetze[0][0] ?



  • happystudent schrieb:

    Ich find die hier nicht überflüssig sondern notwendig um auszudrücken mit was man da eigentlich arbeitet.

    Wie würdest du dein vector<vector<vector<int>>> denn nennen?

    typedef int sitzplatz;
    typedef vector<sitzplatz> reihe;
    typedef vector<reihe> raum;
    typedef vector<raum> haus; // = vector<vector<vector<int>>>
    


  • oenone schrieb:

    typedef int sitzplatz;
    typedef vector<sitzplatz> reihe;
    typedef vector<reihe> raum;
    typedef vector<raum> haus; // = vector<vector<vector<int>>>
    

    Das ändert doch nichts am eigentlichen Problem. Du liest den Code der irgendwo deinen ge-typedef-ten vector<vector<vector<int>>> benutzt:

    std::cout << mein_haus[0][1][2] << '\n';
    

    und dann ist erstmal rätseln angesagt, was den die Zeile jetzt überhaupt bedeuten soll. Mal ganz davon abgesehen dass das auch nicht besser wird wenn du einen Raum um einen vector für Türen/Fenster/etc. erweitern willst.

    Dagegen so:

    std::cout << mein_haus.platz_in_raum(0, 1, 2) << '\n';
    std::cout << mein_haus.tuer_in_raum(0, 2) << '\n';
    std::cout << mein_haus.fenster_in_raum(0, 1, 3).blumenkasten(2) << '\n';
    

    und schon hat man kein Problem mehr.



  • happystudent schrieb:

    oenone schrieb:

    typedef int sitzplatz;
    typedef vector<sitzplatz> reihe;
    typedef vector<reihe> raum;
    typedef vector<raum> haus; // = vector<vector<vector<int>>>
    

    Das ändert doch nichts am eigentlichen Problem. Du liest den Code der irgendwo deinen ge-typedef-ten vector<vector<vector<int>>> benutzt:

    std::cout << mein_haus[0][1][2] << '\n';
    

    und dann ist erstmal rätseln angesagt, was den die Zeile jetzt überhaupt bedeuten soll. Mal ganz davon abgesehen dass das auch nicht besser wird wenn du einen Raum um einen vector für Türen/Fenster/etc. erweitern willst.

    Dagegen so:

    std::cout << mein_haus.platz_in_raum(0, 1, 2) << '\n';
    std::cout << mein_haus.tuer_in_raum(0, 2) << '\n';
    std::cout << mein_haus.fenster_in_raum(0, 1, 3).blumenkasten(2) << '\n';
    

    und schon hat man kein Problem mehr.

    Eigentlich sinds named parameters, die das Land braucht.

    x=berechneKegelvolumen(5,6);
    

    ist nunmal kacke. Und nicht anders sieht es in jeder x-beliebigen Lib aus.

    x=berechneKegelvolumen(hoehe:=5,radius:=6);//alles wird gut//freiwillig
    

    und dann

    std::cout << mein_haus[stockwerk:=0][sitzreihe:=1][2] << '\n';
    


  • volkard schrieb:

    Eigentlich sinds named parameters, die das Land braucht.

    Das wäre cool... Hab mal recherchiert und es gibt ja tasächlich schon ein Proposal dafür 👍


  • Mod

    Du kannst dir ja auch was schreiben, das Zugriff nur so zulaesst: mein_haus.raum(5).reihe(2).sitz(4)


  • Mod

    happystudent schrieb:

    volkard schrieb:

    Eigentlich sinds named parameters, die das Land braucht.

    Das wäre cool... Hab mal recherchiert und es gibt ja tasächlich schon ein Proposal dafür 👍

    Das ist IMO unsinniger Quatsch. Wird garantiert nie bei C++ reinkommen.



  • Arcoth schrieb:

    Das ist IMO unsinniger Quatsch. Wird garantiert nie bei C++ reinkommen.

    Vermutlich.
    Nur kommts leider auch nicht in die IDEs rein, daß man beim Funktionsaufruf die Namen lesen kann (,ohne für jedes einzelne Argument mit der Maus drüber fahren zu müssen).



  • Vielen Dank für eure Tipps,

    nach einigem hin und her habe ich die Lösung für mich gefunden.
    Ich drücke mich im Code allgemein aus.
    Zum Schluss habe ich alle Werte in diesem 3D Array = 1 gesetzt.

    int a***;
    int x;
    int y;
    int z;
    
    a = new int**[x];
    
    for(int i = 0; i < x i++) {
        a[i] = new int*[y];
    
        for(int j = 0; j < y; j++) {
    	a[i][j] = new int[z];
    
    	for(int k = 0; k < z; k++) 
    	    a[i][j][k] = true;
        }
    }
    

  • Mod

    Es sollte mich eigentlich nicht kuemmern, aber irgendwie tut's schon ein bisschen weh 😞



  • Ich bin wahrlich kein Profi, aber ich hab mich lange mit 2 und 3 Stern Zeigern abgekämpft. Hey, vergiss den Code. Das geht schon aber ist echt Müll. Das kapierst sowieso in 3 Wochen nicht mehr. Die besten Lösungen wurden schon genannt.


Anmelden zum Antworten