2d vector resize -> return 3
-
Einen schönen guten Abend, und frohe Weihnachten.
Ich habe folgendes Problem. Ich will mithilfe des SDL ein Fenster erstellen, in dem ich mit der Maus einzelne Tiles platziere. (Ich stelle meine Frage jedoch hier da diese nicht vom SDL handelt.) Ich habe mit
vector < vector <CSprite> > MapSprite;einen 2 Dimensionalen Vector einer Klasse (CSprite) erstellt.
Die erste Dimension erstelle ich mitMapSprite.resize (nMapWidth / nTileWidth);wobei nMapWidth die Breite des Fensters als int und nTileWidth die Breite der Tiles darstellt. Wenn ich jedoch die zweite Dimension mit
for (int i = 0; i < nMapWidth / nTileWidth; i++) MapSprite.at (i).resize (nMapHeight / nTileHeight);erstellen will, wird das Programm mit dem Status 3 verlassen. Es wird zuvor sichergestellt, dass nMapWidth bzw. Height durch nTileWidth bzw.Height teilbar ist.
Kann mir jemand verraten, wo das Problem liegt?Vielen Dank im Voraus, Adam S
-
Status 3? Kannst du mit dem Debugger nachverfolgen, wo das Programm beendet wird?
Versuch mal, die Grössen im Voraus (vor der Schleife) zu berechnen und zu speichern. Das könnte auch effizienter sein.
-
Bedenke, dass hier zahlreiche CSprite-Objekte neu erzeugt werden, teilweise mit Standardkonstruktur, teilweise mit Kopierkonstruktor. Vielleicht sind diese nicht richtig implementiert.
Status 3 klingt auch sehr nach ungefangener Exception oder failed assertion. Frag doch mal den Debugger.
-
Da ich nicht mit dem Debugger umzugehen vermag, habe ich folgendes versucht
vector < vector <CSprite> > MapSprite; cout << "1" << endl; MapSprite.resize (nMapWidth / nTileWidth); cout << "2" << endl; int nmwtw = nMapWidth / nTileWidth, nmhth = nMapHeight / nTileHeight; cout << "3" << endl; for (int i = 0; i < nmwtw; i++) MapSprite.at (i).resize (nmhth); cout << "4" << endl;Das Programm wird genau nach "3" verlassen. Wenn ich die Werte allerdings vorher berechnen lasse, wie in diesem Beispiel, begrüßt mich Windows mit einem "funktioniert nicht mehr...".
Die Map integer haben den Wert 100, die Tile integer den Wert 10. Also sollten 10x10 Objekte vorhanden sein. Es läuft jedoch genauso ab, wenn ich konstante Werte anstatt berechneten Variablen verwende.
Durch eine Konsolenausgabe im Konstruktor der Klasse habe konnte ich erfahren, dass nur ein Objekt erstellt wird, bevor der Absturz erfolgt.
-
Jo, überprüf nochmal, dass in deinen Konstruktoren alles in Ordnung ist.
Du startest dein Programm mit dem Debugger indem du Debug/Step Into anklickst. Wenn was passiert, zeigt dir die IDE dann schon die Details wie Codezeile oder Exceptiondetails an. Alternativ geht auch Rechtsklick im Editor/Run to Cursor, dann hält das Programm an der ausgewählten Zeile an und du kannst z.B. zeilenweise weiterlaufen lassen.
-
Danke für deinen Tipp mit dem Konstruktor.
Die Klasse hat einen Zeiger, der im überladenen Konstruktor definiert wird, im leeren Konstruktor jedoch nicht. Ich hatte vergessen den Zeiger im leeren Konstruktor auf NULL zu setzen.
Vielen Dank für die Hilfe, Adam S