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

21

07.02.2010, 07:56

GameStateManager nutzt sehr wohl EventManager.

GameStateManager ruft nämlich IntroState auf im Konstruktor.

Wenn ich da EventManager noch nicht initalisiert habe kann nix gutes passierne. :)

Edit: Habe jetzt nochmal das komplette Programm mit dem Debugger durchwühlt. Ich kann nix finden ausser das _MyHead in <list> 0x00000 ist und die Zugriffsverletzung verursacht. Hilft aber wahrscheinlich nicht weiter oder?

Edit 2: Das übrigens unabhängig davon ob ich überhaupt was in die Liste einfüge. Habe das mal alles auskommentiert wo ich den EventManager nutze. trotzdem dieser Fehler. Im Unit-Test für den EventManager habe ich den Fehler allerdings nicht.

Ich kommentiere dann weiter aus und gucke mich um. Für einen Tipp wäre ich dankbar.

Edit 3: Habe jetzt die Application zum EventManager Testing hinzugefügt. Dort läuft alles.

Ich hasse diese Fehler. ;D

Edit 4: In EventManager-Testing funktioniert alles! Es funktioniert perfekt. Ich habe beide Programme verglichen. Völlig identisch. Ich verstehe es nicht. :/
Der Fehler in BBAW hat sich aber auch geändert. Beim clearen der list geht er in eine endlos Schleife.

Edit 5: Neue Projektmappe erstellt. Neues Projekt. Alles eingerichtet und hinzugefügt. Voliá es funzt.

Keine Ahnung warum. Auch nachdem ich die Einstellungen verglichen habe weiss ich es nicht.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

22

07.02.2010, 13:52

Undefiniertes Verhalten par exellence. ;)

Zeig mal GameStateManager.

Debug <-> Release macht einen Unterschied?

Wie gesagt zeig mal eine möglichst reduzierte Form des Fehlers und nicht etwas, was so in etwa das gleiche ist und läuft, sondern möglichst wenig Code mit dem gleichen Fehler.

23

07.02.2010, 14:17

Kein Unterschied.

GameStateManager.hpp

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

#include "GameStateInterface.hpp"

class GameStateManager
{
private:
    int currentStateID;
    GameStateInterface * currentState;
    int nextState;
public:

    GameStateManager(void);
    ~GameStateManager(void);
    
    GameStateInterface* GetGameState();
    void SetGameState(int state);
    void changeState();
};

#endif


GameStateManager.cpp

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
#include "GameStateManager.hpp"
#include "enum.hpp"
#include "Application.hpp"
#include "IntroState.hpp"

GameStateManager::GameStateManager()
{
    currentStateID = STATE_INTRO;
    nextState = STATE_INTRO;
    currentState = new IntroState();
}

GameStateManager::~GameStateManager()
{
    delete currentState;
}
GameStateInterface* GameStateManager::GetGameState()
{
    return currentState;
}
void GameStateManager::SetGameState(int state)
{
    nextState = state;
}
void GameStateManager::changeState()
{
    if(this->currentStateID != this->nextState)
    {
        switch(this->nextState)
        {
        case STATE_EXIT:
            Application::GetInstance().GetWindow().Close();
            break;
        }

        this->currentStateID = this->nextState;
    }
}


Möglichst wenig Code mit dem selben Fehler ist ganz leicht. Alles auskommentieren was nicht mit EventManager zu tun hat. Ergo nur noch Application, main-Funktion und EventManager. Trotzdem kann der Fehler dann im selben Moment wieder weg sein.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

24

07.02.2010, 14:28

Ich sehe da immer noch nicht, was die Reihenfolge von

C-/C++-Quelltext

1
2
GameStateManager gsm;
EventManager evtm;

eine Rolle spielen sollte. Das einzige, was sein könnte ist, wenn gsm auf das Objekt von evtm zugreift, was ja noch nicht initialisiert ist im Konstruktor. (sprich du müsstest "gsm ( evtm )" oder ähnlich im Konstruktor haben)

Zitat

Möglichst wenig Code mit dem selben Fehler ist ganz leicht. Alles auskommentieren was nicht mit EventManager zu tun hat. Ergo nur noch Application, main-Funktion und EventManager. Trotzdem kann der Fehler dann im selben Moment wieder weg sein.

Ja. Mach das und dann poste das ganze auf nopaste oder so. Ein Programm, wo aller Code vorhanden ist und mit exakter Beschreibung wo der Fehler passiert ist ( Zeile + exakte Meldung ).
Oder kommt der Fehler nicht bei jeder Ausführung? Oder kannst du den Fehler ein/ausschalten indem du z.B einen comment (also nichts auskommentieren, sondenr nur ein /*asdfasdf*/) einbaust? (hatte ich mal)

25

07.02.2010, 14:33

Ich setze mich gleich mal an so ein Programm. Will dich hier nur nicht warten lassen.


GameStateManager ruft im Konstruktor IntroState auf das im Konstruktor evtm aufruft. Wenn gsm vor evtm steht ist evtm ja noch nicht erstellt worden.

Ich kann dir leider keine genau Zeile sagen. Das passiert alles im Disambley.

Der Fehler kommt schon bei jeder Ausführung bzw. die Endlosschleife ist es ja jetzt. Allerdings nur mit diesem einen Projekt. Egal welches andere. Da läufts. Testweise drei erstellt. Alles okay.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

26

07.02.2010, 14:40

Zitat von »"Môr"«


GameStateManager ruft im Konstruktor IntroState auf das im Konstruktor evtm aufruft. Wenn gsm vor evtm steht ist evtm ja noch nicht erstellt worden.

Das sind völlig andere Objekte. Im Konstruktor von GAmeStateManager erstellst du ein Objekt vom Typ IntroState. Was das ganze aber mit evtm zu tun haben soll weiss ich nicht.. Du übergibst keine Objekte und Singletons sinds auch nicht. Und auch wenn du Singletons benutzen würdest, wäre das mit dem Idiom, dass du nutzt kein Problem.

Zitat


Ich kann dir leider keine genau Zeile sagen. Das passiert alles im Disambley.

Ja, aber exakte Fehlermeldung und wo das in deinem Code passiert kannst du mit dem Stacktrace rausfinden.

Ich bin immer noch der Meinung, dass das alles auf den gleichen Fehler zurück zu führen ist. Die unterschiedlichen Verhalte der Fehler ist dann darauf zurückzuführen, dass sich einfach das ganze verschoben hat.

27

07.02.2010, 16:52

Application.hpp
http://nopaste.info/f61f8fa5d5.html

Application.cpp
http://nopaste.info/bcf1378516.html

EventManager.hpp
http://nopaste.info/ca63b5e9fd.html

EventManager.cpp
http://nopaste.info/79bf5ce878.html

main.cpp
http://nopaste.info/c98cb9f7bf.html


Fehlermeldung:

Zitat

Eine Ausnahme (erste Chance) bei 0x003e3ac0 in BBAW_v3.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
Unbehandelte Ausnahme bei 0x003e3ac0 in BBAW_v3.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.


Aufrufliste:

Zitat

> BBAW_v3.exe!std::list<EventObserver *,std::allocator<EventObserver *> >::clear() Zeile 832 + 0xf Bytes C++
BBAW_v3.exe!std::list<EventObserver *,std::allocator<EventObserver *> >::_Tidy() Zeile 1214 C++
BBAW_v3.exe!std::list<EventObserver *,std::allocator<EventObserver *> >::~list<EventObserver *,std::allocator<EventObserver *> >() Zeile 522 C++
BBAW_v3.exe!Application::~Application() + 0x57 Bytes C++
BBAW_v3.exe!`Application::GetInstance'::`2'::`dynamic atexit destructor for 'app''() + 0x28 Bytes C++


Damit erhalte ich zwar wieder die Zugriffsverletzung beim schliessen, aber auch wenn ich wieder alles rückgänig mache geht er net mehr in die Endlosschleife.

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

28

07.02.2010, 17:12

Nur mal so ne Frage. Warum führt das Aufrufen von GetInstance() zum Zerstören von Application?
Ein Singleton sollte eigentlich beim Aufruf von GetInstance() nicht zerstört werden...


EDIT: Der Code von GetInstance() sieht aber richtig aus, wird wohl ebenfalls auf das undefinierte Verhalten zurückzuführen sein :roll:

EDIT 2: Was ist der Sinn von main.cpp:7 ?
<< an dieser Stelle ist eine Signatur verstorben >>

29

07.02.2010, 17:16

Das passiert ja alles nachdem die main-Funktion bereits beendet ist. Daher beim aufräumen.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

30

07.02.2010, 17:28

Ist EventObserverInterface diese Klasse?

C-/C++-Quelltext

1
2
3
4
5
6
class EventObserverInterface
{
public:
    virtual void GetEvent(const sf::Event& event) = 0;
    virtual ~EventObserverInterface () {} // <-- wichtig!!

}; 


Ich habe den virtuellen Destruktor noch hingetan, weil der wichtig werden kann. Ist aber denke ich nicht die Ursache des Problems.

Wenn du das hier machst:

C-/C++-Quelltext

1
2
3
4
5
6
7
     while(GetWindow().GetEvent(event))
     {
         if(event.Type == sf::Event::Closed)
             GetWindow().Close();
  
         //GetEventManager().notify(event);

     }

Was passiert dann?

attachObserver wird ja auch nie aufgerufen, oder?

Was ich noch als gefährlich anschaue ist die Ausgabe im Destruktor von EventManager. Das ist undefiniert, weil cout bereits zerstört sein kann und erst dann Application zerstört wird.

Kannst du das noch drauf reduzieren, dass es kein SFML benutzt?

/EDIT:
@void: Das wird wohl (unnötigerweise) dazu benutzt, dass das Singleton lebt.

Was hast du überhaupt für einen Compiler?

Werbeanzeige