Du bist nicht angemeldet.

Werbeanzeige

1

09.12.2014, 20:13

Vector klappt nicht

Ich will eine Tilemap erstellen und speichere dazu jedes Tile in einem Vector, der die Linie ist. Diese Vectoren speicher ich wiederum in einem Vector der die Zeile ist. Allerdings speichert mein Linienvector nur 2 Teile bevor das Programm abstürzt.
Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    std::string Line;
    std::vector<Tiles> tiles;
    Tiles tile;
    std::cout << "Test 1" << std::endl;
    std::ifstream Input("tiles.txt");
    while (!Input.eof()) {
        std::getline(Input, Line, '\n');
        std::cout << "Line:" << Line.length() << std::endl;
        std::cout << "Test 2" << std::endl;
        for (int i = 0; i < Line.length(); i++) {
            std::cout << "Test 3." << i + 1;
            if (Line[i] == '#') {
                tile.create(TileTex, sf::IntRect(100, 0, 100, 100), 800 / 8);
            }
            else if (Line[i] == '0') {
                tile.create(TileTex, sf::IntRect(0, 0, 100, 100), 800 / 8);
            }
            else if(Line[i] == '1'){
                tile.create(TileTex, sf::IntRect(100, 100, 100, 100), 800 / 8);
            }
            else {
                tile.create(TileTex, sf::IntRect(0, 100, 100, 100), 800 / 8);
            }

            std::cout << ".1";
            tiles.push_back(tile);
            std::cout << ".1";
            std::cout << std::endl;
        }
        std::cout << "Test 4" << std::endl;
        m_Tiles.push_back(tiles);
        tiles.clear();
    }
    Input.close();


m_Tiles ist folgend definiert:

C-/C++-Quelltext

1
std::vector<std::vector<Tiles>> m_Tiles;


Was mache ich Falsch?

BlueCobold

Community-Fossil

Beiträge: 10 859

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

09.12.2014, 20:22

Cursor in Zeile 6 packen. F9 drücken. F5 drücken. Wenn das Programm anhält, F10 solange drücken, bis Du siehst, warum es wo abstürzt. Mit der Maus über einer Variable kannst Du ihre Werte anschauen.

Für weitere Hotkeys: http://msdn.microsoft.com/en-us/library/…v=vs.60%29.aspx
Viel Spaß mit dem Debugger.

PS: Ich hoffe Tile::create sieht nicht so aus: Tile::create(sf::Texture tileTex, ...). Falls doch, hast Du dort ein gewaltiges Speicher-Problem.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

09.12.2014, 21:14

Tilecreate siht folgendermaßen aus:

C-/C++-Quelltext

1
void create(sf::Texture *Texture, sf::IntRect TextureRect, float size);

Und so TileTex:

C-/C++-Quelltext

1
2
TileTex = new sf::Texture;
TileTex->loadFromFile("tiles.png");


Beim Debugging gibt er nun folgenden Fehler aus:

Zitat

Unhandled exception at 0x01168DD5 in Project1.exe: 0xC0000005: Access violation reading location 0xFEEEFEEE.

Und er zeigt auf dieser Zeile(Die Zeile in der der Pfeil ist):

C-/C++-Quelltext

1
2
3
Tiles::~Tiles() {
->delete m_Sprite;
}

Dieser Fehler tritt erst auf, wenn ich Versuche das 4. Tile in den Vector zu schieben

FSA

Community-Fossil

  • Private Nachricht senden

4

09.12.2014, 21:44

* 0xFEEEFEEE : Used by Microsoft's HeapFree() to mark freed heap memory

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veralteten strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

BlueCobold

Community-Fossil

Beiträge: 10 859

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

09.12.2014, 22:00

Du arbeitest da meiner Meinung nach viel zu viel mit new und delete. Ist völlig überflüssig. Ganz speziell bei Sprites. Dein Delete-Problem wird wohl entstehen, weil Du irgendwo Tiles kopierst und somit mehrere Tile-Objekte denselben Sprite-Pointer verwenden und sobald ein Tile zerstört wird, wird das Sprite gelöscht. Wird das nächste Tile auch zerstört, bekommst Du Deinen Crash. Bei push hast Du zum Beispiel so einen Kopier- und Zerstör-Vorgang.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

6

10.12.2014, 06:52

Erstelle das Sprite nun nicht mehr als Pointer sondern ganz normal. Nun klappt auch alles. Danke

Werbeanzeige