Du bist nicht angemeldet.

Werbeanzeige

1

02.04.2016, 21:11

C++ mit SFML - "vector subscript out of range"

Hallo liebe Community,

ich programmiere jetzt schon ne Weile an meinem kleinen Spiel rum, aber bekomme jetzt andauernd einen Error:

C-/C++-Quelltext

1
2
3
4
Debug Assertion Failed!
[...]
Expression: vector subscript out of range
[...]


Ich bin jetzt kurz vorm Verzweifeln :dash:
Das irgendein Problem mit dem Vektor vorliegt, dessen bin ich mir bewusst ... aber ich finde den Fehler einfach nicht.

Hier der Quellcode (nur die main.cpp; andere Dateien kann ich bei Bedarf gerne auch nachreichen):

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// TheBindingOfZyklop.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <SFML/Graphics.hpp>  //Einbinden der SFML Lybary

#include "Schablone.hpp"
#include "player.hpp"
#include "projektil.hpp"

using namespace std;     
#include <iostream>



int main()
{   
    //Fenster erstellen mit x=800, y=600
    sf::RenderWindow window(sf::VideoMode(800, 600), "TBoZ");


    //Spielertextur laden
    sf::Texture texturePlayer;
    texturePlayer.loadFromFile("TexturePlayer.png");
    sf::Sprite spritePlayer(texturePlayer);
    //spritePlayer.setPosition(window.getSize().x / 2, window.getSize().y / 2); //Sprite in der Mitte des Bildschirms platzieren
    //spritePlayer.setTextureRect(sf::IntRect(17 * 32, 0, 32, 32));


    //Spieler erstellen
    class CPlayer Spieler1;
    Spieler1.sprite.setTexture(texturePlayer);


    //Projektil Vektor Array erstellen
    vector<CProjektil>::const_iterator iter;
    vector<CProjektil> projektilArray;
    class CProjektil Projektil1; //Projektil erstellen


    //Main Loop!
    do
    {
        window.clear();  //Fenster resetten

        window.draw(Spieler1.sprite); //Spieler "spawnen"

        //Update Player
        Spieler1.updatePlayer();
        Spieler1.updateMovement();
        Spieler1.updateAttack();


        //Projektil abfeuern
        if ((sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) || (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) || (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) || (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) )
        {
            Projektil1.rect.setPosition(Spieler1.rect.getPosition()); //Projektil bei Spieler spawnen
            Projektil1.Richtung = Spieler1.Richtung;
            projektilArray.push_back(Projektil1); //Projektil in Array verfrachten
        }
    
        //Projektile anzeigen
        int counter = 0;
        for (iter = projektilArray.begin(); iter != projektilArray.end(); iter++);
        {
            projektilArray[counter].updateProjektil();
            window.draw(projektilArray[counter].rect);
            counter++;
        }
        
        window.display();
    } while (!sf::Keyboard::isKeyPressed(sf::Keyboard::Escape));  //ESC beendet Programm

    return 0;
}


Ich denke der Fehler kann auf die Zeilen 35 - 38, bzw. 55 - 69 eingegrenzt werden.

Das Problem liegt mit hoher Wahrscheinlichkeit in der for-Schleife oder?



MfG,
Blaufrosch

PS: Ich arbeite nach einem YT-Tutorial. Dort scheint alles zu funktionieren ?(
Habe noch nicht so die Erfahrungen mit C++ und SFML :(
YT-Video

2

02.04.2016, 21:33

Hier übrigens die updateProjektil-Funktion, die in der for-Schleife aufgerufen wird

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void CProjektil::updateProjektil()
{
    if (Richtung == 1) //Projektil nach RECHTS
    {
        rect.move(m_Projektilgeschwindigkeit,0);
    }
    if (Richtung == 2) //Projektil nach LINKS
    {
        rect.move(-m_Projektilgeschwindigkeit,0);
    }
    if (Richtung == 3) //Projektil nach UNTEN
    {
        rect.move(0,m_Projektilgeschwindigkeit);
    }
    if (Richtung == 4) //Projektil nach OBEN
    {
        rect.move(0,-m_Projektilgeschwindigkeit);
    }
}

3

02.04.2016, 21:42

Das Problem liegt mit hoher Wahrscheinlichkeit in der for-Schleife oder?

Naja zu mindestens solltest du sie ohne 'counter' nutzen!

C-/C++-Quelltext

1
2
3
4
5
for(iter = container.begin(); iter != container.end(); ++iter)
{
    iter->update();
    sfmlWindow.draw(*iter);
}
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

4

02.04.2016, 22:18

iter->update();
sfmlWindow.draw(*iter);


Wie genau, würde man das in meinem Beispiel jetzt implementieren ?(
Wenn ich das, so in der Art, in mein Programm übernehme spuckt er mit Fehlermeldungen um sich :huh:

Bin wie gesagt noch ziemlich unerfahren ;(

Edit: Vergessen zu sagen, dass es echt irgendwie hirnrissig ist, da 'nen Counter mitlaufen zu lassen, wenn das doch schon der Iterator macht :pillepalle:
Also, danke für den Hinweis :thumbsup:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Blaufrosch« (02.04.2016, 22:38)


5

03.04.2016, 06:54

Wie genau, würde man das in meinem Beispiel jetzt implementieren ?(
Wenn ich das, so in der Art, in mein Programm übernehme spuckt er mit Fehlermeldungen um sich

Diese Transferleistung würde ich gern dir überlassen, zeig doch mal deine for-Schleife.

Edit: Vergessen zu sagen, dass es echt irgendwie hirnrissig ist, da 'nen Counter mitlaufen zu lassen, wenn das doch schon der Iterator macht :pillepalle:
Also, danke für den Hinweis :thumbsup:

Man könnte das ganze auch Problemlos mit einem zähler umsetzen.

C-/C++-Quelltext

1
2
3
4
5
for(int i = 0; iter < container.size(); ++i)
{
    container[i].update();
    sfmlWindow.draw(container[i].rect);
}

Aber mischen ist dann nicht der Richtige Weg.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

6

03.04.2016, 14:13

Diese Transferleistung würde ich gern dir überlassen, zeig doch mal deine for-Schleife.


Habe oben das const vor dem Iterator weggenommen.

C-/C++-Quelltext

1
2
vector<CProjektil>::iterator iter;
    vector<CProjektil> projektilArray;


Meine Schleife sieht nun wie folgt aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
for (iter = projektilArray.begin(); iter != projektilArray.end(); ++iter);
        {
            //projektilArray[counter].updateProjektil();
            //window.draw(projektilArray[counter].rect);
            //counter++;
            iter->updateProjektil();
            window.draw(*iter);
        }


In Zeile 7 unterstreicht er mir jetzt den "." und gibt die Fehlermeldung:
"no instance of overloaded functioon "sf::RenderWindow::draw matches the argument list" :(

7

03.04.2016, 14:40

Soweit so gut, du möchtest aber nicht den container zeichnen sondern etwas was der container enthält.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Nimelrian

Alter Hase

Beiträge: 1 261

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

8

03.04.2016, 14:56

Du könntest auch aufhören, einen Iterator zu benutzen und einfach eine Range-based for-Schleife nutzen.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

9

03.04.2016, 15:03

Soweit so gut, du möchtest aber nicht den container zeichnen sondern etwas was der container enthält.

War nicht genau dafür der Dereferenzierungsoperator da oder verwechsel ich jetzt etwas ?(

Du könntest auch aufhören, einen Iterator zu benutzen und einfach eine Range-based for-Schleife nutzen.

Und das heißt jetzt was? :huh: Wie gesagt, bin noch ziemlich unerfahren und kann dementsprechend nicht mit allem etwas anfangen :|

Nimelrian

Alter Hase

Beiträge: 1 261

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

10

03.04.2016, 15:24

Du könntest auch aufhören, einen Iterator zu benutzen und einfach eine Range-based for-Schleife nutzen.

Und das heißt jetzt was? :huh: Wie gesagt, bin noch ziemlich unerfahren und kann dementsprechend nicht mit allem etwas anfangen :|

Google ist normalerweise ein guter Ansatz für Begriffe, die man noch nicht gehört hat ;)

Grundsätzlich besteht sowieso 50% der Alltag eines Programmierers daraus, zu googlen, 40% sind notwendig um die auf Google gefundenen Lösungen an das eigene Problem anzupassen und 10% sind dann das eigentliche Coding.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Werbeanzeige