Dreidimensionalen Array abfragen



  • Programmier das doch erstmal in 1D. Wenn das funktioniert und du verstehst wie es geht, ist das erweitern auf 2D und dann 3D ein Klacks.

    Und schmeiss deinen unlesbaren Code weg. Danke.



  • Die Probleme sind ja schon genannt worden: Absolut keine Abstraktion mit Hilfe einer geeigneten Struktur und die Hauruckmethode, alles in dieser einen Funktion machen zu wollen. Wenn du für das Problem unterteilst, schreibt sich das Programm fast von alleine.
    Minimalbeispiel für eine 3D-Arrayklasse:

    template<typename T, class C=std::vector<T>>
    class Arr3D
    {
    public:
    	Arr3D(size_t w=1, size_t h=1, size_t d=1, const T& fill=T())
                : m_width(w), m_height(h), m_depth(d), m_data(w*h*d, fill)
    	{ }
    	const T& Get(size_t x, size_t y, size_t z) const {
    		return m_data[index(x, y, z)];
    	}
    	void Set(size_t x, size_t y, size_t z, const T& val) {
    		m_data[index(x, y, z)]=val;
    	}
    	void Fill(const T& fill=T()) {std::fill(m_data.begin(), m_data.end(), fill);}
    	size_t GetWidth() const	{return m_width;}
    	size_t GetHeight() const {return m_height;}
    	size_t GetDepth() const {return m_depth;}
    private:
    	size_t index(size_t x, size_t y, size_t z) const {
    		assert(x<m_width && y<m_height && z<m_depth);
    		return x+m_width*(y+m_height*z);
    	}
    	size_t m_width, m_height, m_depth;
    	C m_data;
    };
    

    Das ist halt wirklich das abolute Minimum. Aber so hat man zumindest Gewissheit, nicht über Arraygrenzen hinaus zu lesen oder zu schreiben. Es könnte noch erweitert werden, dass auch in der Releaseversion die Grenzen gecheckt werden. Bei dem C-Array wird ggf. eine OS-Exception ausgelöst oder du überschreibst eigene Stack-Variablen und das Programm crasht, wenns blöd läuft, an einer ganz anderen Stelle.
    Dann noch die vielen direkt gecodeten Konstanten. Du kannst ja mal nachzählen, an wievielen Stellen du diesen kurzen Code ändern müsstest, wenn sich die Dimension der Box ändern soll. Gleiches gilt auch für das '.'-Zeichen.
    Und eben unterteilen:
    Ob ein Paket in eine Ebene passen könnte, lässt sich schon schnell ermitteln, indem alle freien Plätze in der Ebene gesucht werden. Nur wenn die Anzahl größer gleich Paketbreite x Pakettiefe ist, kann es überhaupt passen.
    Dann die Indizes bestimmen, bis einem etwas Besseres einfällt, könnte man einfach von einem Index aus in x-, y- und z-Richtung schauen. Netter Nebeneffekt: Wenn die Grenze der y-Richtung auf 0 gesetzt wird, kann auch kein Paket unter ein bereits Eingefügtes gelegt werden. Wenn alle drei Bedingungen erfüllt sind, kann das Paket platziert werden und mit dem nächsten fortgefahren werden.
    Wenn du für jeden Schritt eine Funktion schreibst, die für sich nicht viel macht, dafür aber korrekt arbeitet, ließe sich das Programm auch noch zu einem späteren Zeitpunkt erweitern und verbessern.



  • @Patrick_P Du solltest (mit Whitespace) formatierten Text mit Code-Tags versehen, damit die Leerzeichen auch erhalten bleiben.

    @Patrick_P sagte in Dreidimensionalen Array abfragen:

     0 0 0 0 0 0     1 1 0 0 0 0     1 1 2 2 2 0
     0 0 0 0 0 0     1 1 0 0 0 0     1 1 2 2 2 0
     0 0 0 0 0 0     0 0 0 0 0 0     0 0 2 2 2 0
     0 0 0 0 0 0     0 0 0 0 0 0     0 0 0 0 0 0
    


  • @yahendrik Danke für das Beispiel 🙂
    Läuft aber noch nicht ganz bei mir, weil paar #include gefehlt haben und noch ein paar errors vorhanden sind.

    @DirkB Habe ich geändert, danke 😉


Anmelden zum Antworten