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 Funktion std::getline() auch in std::string einlesen:

    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...
    sorry

    Alos 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.


Anmelden zum Antworten