Abstürze und Endlosschleifen ohne Schleifen
-
Hi
ich hab hier ein ganz komisches Verhalten was ich nicht verstehe: Ich habe 3 Klassen: "MainMenu", "ScrollableList" und "ScrollableListElement". In der Klasse "MainMenu" gibt es die Methode add_menu() in der ich 10 "ScrollableListElement"e erstelle, diese in einer "ScrollableList" speichere, und diese ScrollableList dann in meinem MainMenu ablege. Kurze Warnung vorweg, es ist alles sehr hackig und ich hab nicht mal getter/setter benutzt, das liegt daran dass ich das Menü nur rendern soll, die generierung macht ein Kommolitone, und das generieren hier ist nur schnell hingepanscht damit ich was habe womit ich arbeiten kann.
Also, MainMenu.h (auszug):
class MainMenu : public Controllable, public GuiObject { private: static std::list<ScrollableList> menu_list; public: void add_menu(); void render_to_screen(int pos_x=0, int pos_y=0); // [...]MainMenu.cpp
void MainMenu::add_menu() { // Implementation nur zu testzwecken ScrollableListElement *elementenliste[10]; std::string elementlabel; for(int i=0; i<10; i++) { elementlabel = "Element "; elementlabel += i; // Der ScrollableListElement-Konstruktor erwartet einen String // und speichert diesen einfach ab: elementenliste[i] = new ScrollableListElement(elementlabel); } // Mehr zu ScrollableList.cpp weiter unten. Prinzipiell hat es nur // ein Array von ScrollableListElementen und die Anzahl der Elem. ScrollableList *neueliste = new ScrollableList(); neueliste->num_list_elements = 10; neueliste->list_elements = elementenliste; this->menu_list.push_back(*neueliste); }ScrollableList.h:
class ScrollableList : public Controllable, public GuiObject { private: // [...] public: // zu testzwecken public und so ScrollableListElement **list_elements; int num_list_elements; // [...] void render_to_screen(int pos_x=0, int pos_y=0); };Da sind ja jetzt noch die render_to_screen-funktionen, und das ist wo ich auf die Probleme stoße (die wahrscheinlich durch die generierung kommen), die sehen wie folgt aus:
MainMenu.cpp:
void MainMenu::render_to_screen(int pos_x, int pos_y) { std::list<ScrollableList>::iterator i; for(i=menu_list.begin(); i != menu_list.end(); ++i) i->render_to_screen(0,0); }ScrollableList.cpp:
void ScrollableList::render_to_screen(int pos_x, int pos_y) { for(int i=0; i<num_list_elements; i++) { list_elements[i]->render_to_screen(0, 0); } }Und ScrollableListElement.cpp hat auch eine render_to_screen die zu debugzwecken aber einfach nur einen text ausgibt:
void ScrollableListElement::render_to_screen(int pos_x, int pos_y) { printf("Listenelement "); }So stürzt das Programm einfach ab. Jetzt kommt der freakige Teil:
Wenn ich die Schleife ScrollableList.cpp auf <2 begrenze geht's, darüber stürzt es ab. Wenn ich keine Schleife benutze, sondern einfach so durchgehe:list_elements[0]->render_to_screen(0, 0); list_elements[1]->render_to_screen(0, 0); list_elements[2]->render_to_screen(0, 0); list_elements[3]->render_to_screen(0, 0);geht es auch wenn ich über das [1]e Element hinausgehe. Wenn ich aber über das [3]e Element zugreife spuckt er mir in einer Endlosschleife "Listenelement" (wie in ScrollableListElement.cpp auf den Bildschirm! Und ab dem Zugriff auf das [5]e Element stürzt er einfach wieder ab!
Für mich total freaky, nehme an irgendwas wird da beim generieren im speicher verhunzt oder so, weiß aber einfach nicht was.
Grüße
Lukas
-
Das hatte ich vergessen, in meiner main.cpp ruf ich den kram natürlich auf
MainMenu *mm = new MainMenu(); mm->add_menu(); printf("Vortest "); mm->render_to_screen();
-
Schon mal mit nem Debugger gearbeitet?
-
Hat ScrollableList Destruktor und/oder Zuweisungsoperator?
-
ragabagabimba schrieb:
Schon mal mit nem Debugger gearbeitet?
Nein, noch nicht *schäm*. Ist in dem Fall auch was schwieriger, wenn auch möglich weil das ganze ein PSP-Programm ist.
MFK schrieb:
Hat ScrollableList Destruktor und/oder Zuweisungsoperator?
Weder noch...
-
Nur so nebenbei:
std::string elementlabel; for(int i=0; i<10; i++) { elementlabel = "Element "; elementlabel += i; // das hier macht nicht das, was Du erwartest!!!
-
Du speicherst in neueliste->list_elements die Adresse von elementenliste. Das ist aber ein lokales Array in MainMenu::add_menu, die Adresse ist nach Ende dieser Methode nicht mehr gültig.
-
jencas schrieb:
Nur so nebenbei:
std::string elementlabel; for(int i=0; i<10; i++) { elementlabel = "Element "; elementlabel += i; // das hier macht nicht das, was Du erwartest!!!Schade, ich hatte gehofft C++ würde das können
MFK schrieb:
Du speicherst in neueliste->list_elements die Adresse von elementenliste. Das ist aber ein lokales Array in MainMenu::add_menu, die Adresse ist nach Ende dieser Methode nicht mehr gültig.
Ah ja, vielen dank!
