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

11

06.02.2010, 22:29


(Link)


Hoffe das meintest du.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

12

06.02.2010, 22:36

Jap. Genau das. Allerdings liegt der Fehler eher weniger in std::list. ;)
Geh mal auf die Ebene von dem push_back.

13

06.02.2010, 22:39

Oh, entschuldige.


(Link)


Schonmal danke fürs viele helfen bisher. :)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

14

06.02.2010, 22:47

Hmm. Sieht eigentlich gut aus.

Probier mal alles so weit, wie möglich einzugrenzen. Also so weit alles reduzieren, wie möglich. Also Code auskommentieren, der nicht gebraucht wird, um den Fehler zu erzeugen. Am besten so weit, dass nur noch die main Funktion und vlt. eine Klasse da steht. Damit man das Programm komplett überblicken kann (oder natürlich noch weniger).

15

06.02.2010, 22:59

Mini Programm getippt. Und läuft. Ergo der Fehler muss woanders liegen...nur wo?

main.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
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include "main.hpp"
#include "EventManager.hpp"
#include "IntroEventObserver.hpp"

sf::RenderWindow window;

int main()
{
    EventManager evmt;
    IntroEventObserver ievo;

    evmt.attachObserver(ievo);
    window.Create(sf::VideoMode(800, 600), "Test");

    while(window.IsOpened())
    {
        sf::Event event;
        while(window.GetEvent(event))
        {
            evmt.notify(event);
        }
        
        window.Display();
    }
    
    evmt.dettachObserver(ievo);

    return 0;
}


main.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
#ifndef MAIN_HPP
#define MAIN_HPP

#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>

extern sf::RenderWindow window;

#endif


IntroEventObserver.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
#include "IntroEventObserver.hpp"
#include "main.hpp"

void IntroEventObserver::GetEvent(const sf::Event &event)
{
    if(event.Type == sf::Event::KeyPressed)
        window.Close();
}


Die einzigen Sachen die ich geändert habe bzw. neu geschrieben habe. Wer ne Idee?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

16

06.02.2010, 23:09

Ja. Darum habe ich gesagt, dass du das ursprüngliche reduzieren sollst. ;)

Das machst du Schritt für Schritt und schaust, ob der Fehler noch da ist.

Da ist halt das Problem, dass du irgendwo was undefiniertes machst und daher kann dann auch etwas harmloses den Fehler zur Laufzeit auslösen (auch wenn wie bei der der Fehler nicht dort liegt.. üblicherweise kommt halt schon der 0-Zeiger vor. ;))

17

06.02.2010, 23:34

Lösung war einfacher als gedacht. EventManager vor GameStateManager initalisieren...

Nun habe ich nur noch das Problem das es ne Zugriffsverletzung beim destruktor gibt...

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

18

06.02.2010, 23:57

Ich bezweilfe, dass das Problem war. Wie ich gesagt habe, wenn du undefiniertes Verhalten hast, dann kann eine unscheinliche Änderung (wie die Initialisierungsreihenfolge) den Fehler wieder verschwinden lassen oder ihn verschieben, was bei dir offensichtlich passiert ist.

Andere Frage: Warum sollte die Reihenfolge da eine Rolle spielen? EventManager hat rein gar nichts mit Game GameStateManager zu tun und ich nehme mal an, dass das umgekehrte auch gilt. Warum sollte das also die Lösung des Problems sein?

Du solltest dich eher auf die Suche nach einem Zugriff auf ungültigen Speicher machen, denn genau das hast du.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

19

07.02.2010, 00:00

der erste gedanke der mir dabei gekommen ist, ist die neue singletonklasse.
vllt solltest du dort als erstes suchen^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

20

07.02.2010, 00:20

Nein. Das hier:

C-/C++-Quelltext

1
static Application& GetInstance() { static Application app; return app; } 

Ist völlig problemlos, sofern es das einzige singleton ist fällt mir nichts ein, wie da was schief gehen könnte.
Auch bei mehreren Singletons kann das nur Probleme machen, wenn Application (oder die andere Klasse) im Destruktor das andere Singleton benutzt. Ansonsten ist das völlig problemlos.

Werbeanzeige