Lists iterator is not dereferenceble
-
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.
-
Soweit ich das erkenne, scheint CTree keine geeignete Kopiersemantik zu haben, das funktioniert dann nicht mit std::list <CTree>.