Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

1

04.07.2015, 16:29

[C++ | SFML] Problem bei einer Liste

Hallo Leute,

ich habe ein 2D-Spiel programmiert. Unteranderem soll nach einem gewissen Interwall ein neues Objekt (in dem Falle ein Asteroid) erstellt, und in die Liste eingeschoben werden.
Wenn ich es kompiliere, bekomme ich keine Fehlermeldungen, aber wenn ich es starte, bekomme ich ein Fenster mit einer Fehlermeldung (siehe Anhang). Hier die ganze Klasse:

Headerdateie:

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
#ifndef MANAGER_HPP
#define MANAGER_HPP

#include <iostream>
#include <list>
#include <SFML\Graphics.hpp>
#include "Asteroid.hpp"

class CAsteroidManager
{
public:
    CAsteroidManager ();

    void Instert (CAsteroid *Asteroid);

    void Spawn  (float Time);
    void Update (float m_fFrameTime);
    void Handle ();
    void Render (sf::RenderWindow *rw);

private:
    std::list<CAsteroid> mList;
    sf::Clock            *m_pClock;

};

#endif


Quelldatei:

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "AsteroidManager.hpp"

// Kosnstuktor
//
// Aufgabe: Was halt nen Konstruktor macht
//
CAsteroidManager::CAsteroidManager ()
{
    // Speicher reservieren
    //

    m_pClock = new sf::Clock;       // Neue Uhr
    m_pClock->restart ();           // Uhr zurücksetzten

} // Konsruktor



// Instert
//
// Aufgabe: Kümmert sich um die Liste
//
void CAsteroidManager::Instert (CAsteroid *Asteroid)
{
    mList.push_back (*Asteroid);    // Asteroid in die Liste einschieben

} // Insert



// Update
//
// Aufgabe: Updatet den MAnager
//
void CAsteroidManager::Update (float m_fFrameTime)
{
    Spawn (0.5f);

    for (auto it : mList)
    {
        it.Update (m_fFrameTime);
    }

} // Update



// Handle
//
// Aufgabe: Handhabt die Liste
//
void CAsteroidManager::Handle ()
{
    for (auto it : mList)
    {
        it.Handle ();
    }

} // Handle


// Render
//
// Aufgabe: Rednert alles
//
void CAsteroidManager::Render (sf::RenderWindow *rw)
{
    for (auto it : mList)
    {
        it.Render (rw);
    }

} // Render



// Spawn
//
// Aufgabe: Spawnt nach einer gewissen Zeit einen neuen Asteroiden
//
void CAsteroidManager::Spawn (float Time)
{
    if (m_pClock->getElapsedTime().asSeconds() > Time)
    {
        // Variablen
        //
        int Speed      = rand() %150  + 50;
        int Rotation   = rand() %100  + 10;
        int xPosition  = rand() %1000 + 30;
        int yPosition  = rand() %200  - 200;

        // Neuen Asteroiden erstellen
        CAsteroid *p = new CAsteroid (std::string ("Data/Asteroid.png"), sf::Vector2f (xPosition, yPosition), sf::Vector2f(0.1f, 0.1f), Speed, Rotation);

        // In die Liste einfügen
        mList.push_back (*p);

        m_pClock->restart (); 
    }

} // Spawn


Was/wo liegt der Fehler?
Vielen Dank im Voraus :)
»cojo2015« hat folgendes Bild angehängt:
  • Fehlermeldung.PNG

2

04.07.2015, 17:17

Hab den Code jetzt nicht durchgesehen, aber Step doch mal mit nem Debugger bis zu der Zeile an der die Exception geworfen wird.

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

3

04.07.2015, 17:41

Ok. Ich habe einen Haltepunkt vor der Funktion "Spawn" gemacht. In der Ausgabe unten steht: m_pClock <Speicher kann nicht gelesen werden>. Habe ich einen fehler im Konstruktor gemacht, oder habe ich irgendwas falsch aufgerufen?

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

4

04.07.2015, 18:11

Verwendest du Release Libraries in Debug Mode oder andersrum?
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

5

04.07.2015, 18:13

Nein, das passt alles so, wie es sein soll.

6

04.07.2015, 18:14

m_pClock wird invalid sein. Allein schon, dass ich nirgendswo ein delete sehe, obwohl ich da ein new seh', uaaagh
Kannst ja auch mal mit valgrind drüber, würde sich sicher lohnen. :)

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

04.07.2015, 18:28

Ist eventuell der "this"-Pointer schon invalid? :rolleyes:
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]

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

8

04.07.2015, 18:40

@Checkmateing: Ich gehe jetzt erstmal was essen. Danach muss ich mich erstmal mit dem Thema beschäftigen. Habe noch nie was davon gehört.

@BlueCobold: Mh.. kann ich nicht sagen, ich muss erstmal Google befragen, was es damit aufsich hat.

Trotzdem danke für die Tipps.
PS: Mir ist es extrem peinlich, dass ich den Destruktor einfach vergessen habe... [Wieseo hau' ich mich selber, Wieseo hau' ich mich selber, Wieseo hau' ich mich selber].

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

04.07.2015, 18:57

Mit anderen Worten: Ich schätze Du hast beim Aufruf von Spawn irgendwo einen Pointer auf CAsteroidManager. Und dieser Pointer ist inkorrekt / nicht initialisiert / schon gelöscht.
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]

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

10

04.07.2015, 19:10

Ja, das stimmt. Ich habe im Framework-Konstruktor nicht initialisiert, aber im Destruktor "deletet". Jetzt habe ich ein neues Problem. In der Asteroiden-Klasse hab ich die folgende Funktion definiert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
// Render
//
// Aufgabe: Rendert den Asteroiden
//
void CAsteroid::Render (sf::RenderWindow *rw)
{
    rw->draw (*m_pSprite);

} // Render


Nun kommt eine andere Fehlermedung im Fenster (siehe Anhang). Diese Funktion hat vorher funktioniert.
»cojo2015« hat folgendes Bild angehängt:
  • Fehlermeldung.PNG

Werbeanzeige