Problem mit Vektoren
-
Hallo,
Also ich hab ein kleines Problem mit Vektoren.
Und zwar will ich grad eine Klasse für Tilemaps schreiben, aber es stürzt dann immer ab.Also hier mal der Code bei dem es abstürzt:
(Also bi zum Map laden Zeile 36 geht alles, habs nur mal zwegs der vollständigkeit rein.)std::ifstream in; in.open(filename.c_str()); // Map-Datei öffnen if(in.is_open()) // wenn datei geöffnet ist, dann lesen { Log->Textout("Datei wird geladen"); char buffer[512]; Image temp; string test; in.getline(buffer, 16, '\n'); //Breite einlesen m_Col = atoi(buffer); in.getline(buffer, 16, '\n'); //Höhe einlesen m_Row = atoi(buffer); Log->Textout("Tilesetgröße geladen X: %i , Y: %i",m_Col,m_Row); in.getline(buffer, 255, '\n'); //Weg-Tileset einlesen temp.CreateImage(buffer,0,0,40,40); TilesetList[0] = temp; in.getline(buffer, 255, '\n'); //Baubar-Tileset einlesen temp.CreateImage(buffer,0,0,40,40); TilesetList[1] = temp; in.getline(buffer, 255, '\n'); //Unbaubar-Tileset einlesen temp.CreateImage(buffer,0,0,40,40); TilesetList[2] = temp; in.getline(buffer, 255, '\n'); //Sonder-Tileset einlesen temp.CreateImage(buffer,0,0,40,40); TilesetList[3] = temp; for(int i=0;i<=4;i++) { TilesetList[i].SetMultiImage(6,2); } Log->Textout("Tilesets geladen"); //Map laden for(int i = 0; i <m_Row ; i++) { vector<Tile> temp; for(int j = 0; j < m_Col; j++) { int T1,T2; in.getline(buffer, 16, '.'); //Ersten Wert einlesen T1=atoi(buffer); in.getline(buffer, 16, '|'); //Zweiten Wert einlesen T2=atoi(buffer); Tile tTile(T1,T2); temp.push_back(tTile); } m_map.push_back(temp); } } else { Log->Textout("Fehler beim laden der Datei %s",filename.c_str()); } in.close(); Log->Textout("Datei fertig geladen"); return true;Und das ist die Datei "map1.txt":
10
10
Weg1.tga
Baubar1.tga
Unbaubar1.tga
Sonder1.tga
1.00 | 1.00 | 3.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 |
1.00 | 0.03 | 0.05 | 1.00 | 1.00 | 1.00 | 1.00 | 0.03 | 0.01 | 3.01 |
1.00 | 0.00 | 1.00 | 0.03 | 0.01 | 0.04 | 1.00 | 0.00 | 1.00 | 1.00 |
1.00 | 0.00 | 1.00 | 0.00 | 1.00 | 0.00 | 1.00 | 0.00 | 1.00 | 1.00 |
1.00 | 0.02 | 0.01 | 0.05 | 1.00 | 0.00 | 1.00 | 0.00 | 1.00 | 1.00 |
1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 0.00 | 1.00 | 0.00 | 1.00 | 1.00 |
1.00 | 0.03 | 0.01 | 0.01 | 0.01 | 0.05 | 1.00 | 0.00 | 1.00 | 1.00 |
1.00 | 0.00 | 1.00 | 1.00 | 1.00 | 1.00 | 0.03 | 0.05 | 1.00 | 1.00 |
1.00 | 0.02 | 0.01 | 0.01 | 0.01 | 0.01 | 0.05 | 1.00 | 1.00 | 1.00 |
1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 |So also mein Problem ist bei der Map, dass das Programm abstürzt und zwar nach dem die Schleife
for(int i = 0; i <m_Row ; i++)i==8 wird. Also danach stürzt das einfach kommentarlos ab. Obwohl m_Row 10 ist.
Das kann meiner meinung nach nur an den Vektoren liegen. Weil wenn man die Mapgröße meinertwegen auf unter 8 Stellt geht alles bzw. es geht auch immer mal wieder bei größeren z.B. bei 20 geht das laden. Und ich komm einfach nicht drauf warum.Hoffe ihr könnt mir helfen und hoffe das das Prblem verstanden wird, weil das ziemlich schwer zum erklären ist. Weil meiner Meinung nach nichts falsch ist und es ja auch teilweiße geht.
Danke für eure Hilfe
mfg stefan
-
Ich sehe jetzt auch nicht gerade was. Kannst du mit dem Debugger nachverfolgen, in welcher Zeile das Programm innerhalb der Schleife abstürzt?
Das Problem könnte undefiniertes Verhalten sein, besonders, da du sagst, manchmal geht es bei anderen Grössen. Ich würde an deiner Stelle weniger fehleranfällige Low-Level-Dinge wie
char-Arrays verwenden. Du kannst mit der globalen Funktionstd::getline()auch instd::stringeinlesen:std::ifstream in("map1.txt"); std::string line; std::getline(in, line, '.');Versuche auch festzustellen, ob alle anderen Variablen beim Absturz die erwarteten Werte besitzen. Hast du schon im Debug-Modus kompiliert? Normalerweise gibt es nämlich eine Fehlermeldung beim Crash, hast du keine solche erhalten?
-
hmm hab ich ganz vergessen mim Debbuger da mal drüber zu gehen...
sorryAlos hab ne Meldung bekommen kann damit aber nicht wirklich was anfangen:
Program received signal SIGSEGV, Segmentation fault.
In ntdll!RtlUnicodeStringToOemString () (C:\Windows\system32\ntdll.dll)
-
Was ist "m_map"?
-
m_Map ist eine Variable von der Klasse Map
Map.hpp
class Map { public: bool LoadDatei(const string &filename); //Ladet eine Fertige Datei mit anzahl von Tilemaps und namen void Show(); private: int m_Row; int m_Col; Image TilesetList[4]; vector<vector<Tile > > m_map; };
-
Wo stürzt es denn ab?
Bei temp.push_back() oder m_map.push_back() ?
-
Bei
m_map.push_back(temp);
Aber wenn er abstürzt eigentlich immer dann wenn i 8 wird also der 9 Durchgang startet.