vectoren



  • Hi!

    Ich habe ein 3 dimensionales Array.

    std::vector<std::vector<std::vector<CObject*> > > m_Spielfeld;
    

    Dieses Array wird mit der Methode

    void CEngine::CreateGame(const unsigned int& Width, const unsigned int& Height)
    {
    	m_Spielfeld.resize(Width);
    	for(unsigned int i = 0; i < m_Spielfeld.size()-1; ++i);
    		m_Spielfeld[i].resize(Height);
    }
    

    Auf die gewünschte Größe erweitert. (Jedenfalls sollte es so sein)

    Will ich nun ein CObject zu dem Array hinzufügen, bekomm ich aus mir unbekannten Gründen eine Fehlermeldung.

    void CEngine::AddObject(const std::string& szPicName, const int& x, const int& y, const unsigned int& Layer)
    {	
    	m_Spielfeld[x][y].push_back(new CObject(m_Bitmaps[szPicName]))
    }
    

    HEAP[RPG.exe]: Invalid allocation size - A8A8A8D0 (exceeded 7ffdefff)
    Nicht abgefangene Ausnahme in RPG.exe: 0xC0000005: Access Violation.

    Wenn ich das Array von Anfang an (im C'tor der Klasse CEngine) auf eine entsprechende Größe setzte, läuft alles problemlos.
    Was machr ich falsch?

    mfg



  • Schau mal in die FAQ. Da werden mehrdimensionale Arrays ausführlich behandelt.



  • In diesem konkreten Fall würde ich aber zuerst mal entweder <= schreiben oder -1 weglassen.



  • Hi!

    Gab ne Fehlermeldung, wenn ich das -1 weg gelassen habe.

    Mit der Function aus der FAQ

    template<typename T> 
    void resize3DimVector(vector< vector< vector<T> > > & vec, size_t FirstDim, size_t SecDim, size_t ThirdDim) 
    { 
        vec.resize( FirstDim ); 
        for (size_t i = 0; i < FirstDim; ++i) 
        { 
            vec[i].resize( SecDim ); 
            for (size_t j = 0; j < SecDim; ++j) 
                vec[i][j].resize( ThirdDim ); 
        } 
    }
    

    functionierts jetzt, auch wenn ich keinen großen Unterschied sehe.

    mfg



  • Schon aufgefallen, dass resize3DimVector() zwei Schleifen, CreateGame() aber
    nur eine beinhaltet. Denk mal drüber nach... 😉



  • Das war nicht der Fehler. Die Schleife für die dritte Dimension hab ich aus der resize3DimVector Function entfernt und es läuft trotzdem noch.

    template<typename T> 
    void resize3DimVector(std::vector< std::vector< std::vector<T> > > & vec, size_t FirstDim, size_t SecDim, size_t ThirdDim) 
    { 
        vec.resize( FirstDim ); 
        for (size_t i = 0; i < FirstDim; ++i) 
        { 
            vec[i].resize( SecDim ); 
            //for (size_t j = 0; j < SecDim; ++j) 
            //    vec[i][j].resize( ThirdDim ); 
        } 
    }
    

Anmelden zum Antworten