Lists iterator is not dereferenceble



  • Hallo Leute,
    Ich habe ein kleines 2D Spiel programmiert. Es funktioniert auch alles, was die Grafik angeht. Allerdings habe ich ein Problem, was die Verwaltung der Bäume, gegen die man nicht fahren soll angeht. Beende ich mein Spiel kommt eine Fehlermeldung, die mir erklärt, dass die Iteratoren von Listen nicht dereferenzierbar sind.
    Hier der Code:

    class CTree
    {
    private:
    	SDL_Surface *m_image;
        SDL_Rect     m_rect ;
    	bool         m_move;
    public:
    	CTree  ();
    	~CTree ();
    
    	void show();
    	void move();
    	void collision(CSki *Ski);
            void check_trees_to_delte();
    };
    
    CTree::CTree()
    {
    	m_image = load_image("baum.bmp");
        SDL_SetColorKey(m_image,SDL_SRCCOLORKEY,SDL_MapRGB(screen->format,255,255,255) );
    
    	m_rect.x = rand() % (SCREEN_WIDTH - m_image->w) + 1;
    	m_rect.y = SCREEN_HEIGHT;
    	m_rect.w = m_image->w;
    	m_rect.h = m_image->h;
    
    	m_move   = true;
    }
    
    CTree::~CTree()
    {
    	SDL_FreeSurface(m_image);
    }
    
    void CTree::show()
    {
    	apply_surface(m_rect.x,m_rect.y,m_image,screen);
    }
    
    void CTree::move()
    {
    	if (m_move)
    	{
    	  m_rect.y -= SCROLLING_SPEED;
    	}
    }
    
    void CTree::collision(CSki *Ski)
    {
    	if (check_collision(this->m_rect,Ski->m_rect))
    	{
    		Ski->m_collided = true ;
    		m_move          = false;
    	}
    }
    
    void CTree::check_trees_to_delte()
    {
    if (m_rect.y < 0) {return (true);}
    else {return (false) ;}
    }
    
    class CTreeList
    {
    private:
    	std::list <CTree*> m_list;
    	std::list <CTree*>::iterator i;
    public:
    	CTreeList();
    	~CTreeList();
    
    	void move_trees();
    	void collision_trees(CSki *Ski);
    	void show_trees();
    	void spawn();
    	void delete_overkill_trees();
    };
    
    CTreeList::CTreeList()
    {
    	i = m_list.begin();
    }
    
    CTreeList::~CTreeList()
    {
    	m_list.clear();
    
    	delete (*i);
    	(*i) = NULL;
    }
    
    void CTreeList::spawn()
    {
    	CTree *Tree = NULL;
    	Tree = new CTree;
    
    	m_list.push_back(Tree);
    }
    
    void CTreeList::move_trees()
    {
    	if (!m_list.empty() )
    	{
    	  for (i=m_list.begin();i!=m_list.end();++i)
    	  {
    		  (*i)->move();	
    	  }
    	}
    }
    
    void CTreeList::collision_trees(CSki *Ski)
    {
    	if (!m_list.empty() )
    	{
    		for (i=m_list.begin();i!=m_list.end();++i)
    		{
    			(*i)->collision(Ski);
    		}
    	}
    }
    
    void CTreeList::show_trees()
    {
    	if (!m_list.empty())
    	{
    		for (i=m_list.begin();i!=m_list.end();++i)
    		{
    			(*i)->show();
    		}
    	}
    }
    
    void CTreeList::delete_overkill_trees()
    {
    i = m_list.begin();
    if ( (*i)->trees_to_delte() )
    {
    m_list.pop_front();
    }
    }
    

    Vielen Dank jedem der mir hilft, KONSTRUKTIVE Vorschläge zur funktion CTreeList::delete_overkill_trees macht oder den Grund für die Fehlermeldung findet.

    Danke jedem, der Zeit darauf verwendet, anderen Leuten zu helfen.
    😉



  • Entferne mal das C-Präfix, du MFC-Faschist.



  • 314159265358979



  • 314159265358979 schrieb:

    Entferne mal das C-Präfix, du MFC-Faschist.

    Außerdem ist dein Destruktor totaler Mist. Du löschst die Elemente und dereferenzierst dann einen Iterator darauf.



  • Hab mir mal die Mühe gemacht deine zweite Klasse stilmäßig aufgleich zu bringen, warum du da Zeiger verwendest, ist mir nicht klar, bei deiner momentanen Funktionalität brauchst du die nicht. Benutze RAII.

    Link: http://codepad.org/mowXEBsZ

    Möglicherweise kann man da mit std::for_each was schöneres basteln, anstatt der vielen for-Schleifen.



  • 314159265358979



  • Habe ich übersehen, tut sie bei deiner aber auch. Was tut diese Funktion überhaupt genau?

    Schöner:

    if(!trees.empty() && trees.begin()->trees_to_delte())
            trees.pop_front();
    


  • 314159265358979



  • Ich spreche von deiner ersten Version. Mit der STL kennst du dich ja im übrigen nicht besonders aus, wenn du jedes mal überprüfst, ob die Liste leer ist.



  • Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum C++ (auch C++0x) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Leute vielen Dank, für die Mühe die ihr euch gemacht habt. Vielen Dank für eure Vorschläge. Es ist mein erstes Spiel und ja ihr habt recht, mit dem STL kenne Ich mich nicht so gut aus. Kennt ihr ein Tutorial, wodurch ich meine STL Kenntnisse ausbessern kann. Ist mein erstes Spiel und Ich denke das sieht man an dem stillosen, teils wenig effizienten Code.

    Trotzdem vielen Dank!!



  • Hier eine Einführung. In deinem C++-Buch sollte die STL auch behandelt werden, sofern es irgendwas taugt.



  • Ja das ist in dem Buch angeschnitten worden. Danke für den Link.



  • Leute Ich bekomme immernoch eine Fehlermeldung, dass iteratoren von Listen nicht dereferenzierbar sind, auch wenn Ich die überarbeitete Klasse übernehme. Es wird auf die Datei list, die Ich einbinde in Zeile 207 hingewiesen.



  • Poste den Code um die Stelle, an welcher der Fehler auftritt und markiere die Zeile mit dem Fehler.



  • Hallo, das Problem liegt darin, dass der Debugger immer an anderen Stelln ein Problem hat- manchmal auch gar nicht.

    class CTree
    {
    private:
    	SDL_Surface *m_image;
        SDL_Rect     m_rect ;
    	bool         m_move;
    public:
    	CTree  ();
    	~CTree ();
    
    	void show();
    	void move();
    	void collision(CSki *Ski);
    	bool check_overkill_trees();
    };
    
    CTree::CTree()
    {
    	m_image = load_image("baum.bmp");
        SDL_SetColorKey(m_image,SDL_SRCCOLORKEY,SDL_MapRGB(screen->format,255,255,255) );
    
    	m_rect.x = rand() % (SCREEN_WIDTH - m_image->w) + 1;
    	m_rect.y = SCREEN_HEIGHT;
    	m_rect.w = m_image->w;
    	m_rect.h = m_image->h;
    
    	m_move   = true;
    }
    
    CTree::~CTree()
    {
    	SDL_FreeSurface(m_image);
    }
    
    void CTree::show()
    {
    	apply_surface(m_rect.x,m_rect.y,m_image,screen);
    }
    
    void CTree::move()
    {
    	if (m_move)
    	{
    	  m_rect.y -= SCROLLING_SPEED;
    	}
    }
    
    void CTree::collision(CSki *Ski)
    {
    	if (check_collision(this->m_rect,Ski->m_rect))
    	{
    		Ski->m_collided = true ;
    		m_move          = false;
    	}
    }
    
    bool CTree::check_overkill_trees()
    {
    	if ( (m_rect.y<0) || (m_rect.x>SCREEN_WIDTH) )
    	{
    		return (true);
    	}
    
    	return (false);
    }
    
    class CTreeList
    {
        std::list <CTree> trees;
    
    public:
    
        void move_trees();
        void collision_trees(CSki *Ski);
        void show_trees();
        void spawn();
        void delete_overkill_trees();
    };
    
    void CTreeList::spawn()
    {
        trees.push_back(CTree());
    }
    
    void CTreeList::move_trees()
    {
        for(std::list<CTree>::iterator iter = trees.begin(); iter != trees.end(); ++iter)
            iter->move();
    }
    
    void CTreeList::collision_trees(CSki *ski)
    {
        for(std::list<CTree>::iterator iter = trees.begin(); iter != trees.end(); ++iter)
            iter->collision(ski);
    }
    
    void CTreeList::show_trees()
    {
        for(std::list<CTree>::iterator iter = trees.begin(); iter != trees.end(); ++iter)
            iter->show();
    }
    
    void CTreeList::delete_overkill_trees()
    {
        if(trees.begin()->check_overkill_trees())
            trees.pop_front();
    }
    

    Das ist der Code. Klasse 2 übernommen. Keine Ahnung, wo der Fehler liegt.



  • Dann reduzier das Problem bitte auf ein Minimalbeispiel, das den Fehler immer noch repräsentiert. Und schau, dass die [cpp]-Tags funktionieren, dafür gibts den Vorschau-Button.


  • Mod

    Soweit ich das erkenne, scheint CTree keine geeignete Kopiersemantik zu haben, das funktioniert dann nicht mit std::list <CTree>.


Anmelden zum Antworten