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

1

30.01.2012, 21:57

[ SFML ] Von sf::RenderWindow zu access violation

Ich schaff es einfach nicht mit sf::RenderWindow in kombination mit Zeigern zu "arbeiten".

Ich habe eine Klasse wo das ganze abläuft, in der .hpp hab ich :


C-/C++-Quelltext

1
sf::RenderWindow *Window;


und in einer entsprechenden Memberfunktion:

C-/C++-Quelltext

1
Window = new sf::RenderWindow(sf::VideoMode(800, 600, 32), "SFML Sample Application");


Soweit so gut, nun will ich Beispielsweise in meiner Eventfunktion drauf zugreifen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        sf::Event Event;
        while (Window->PollEvent(Event))
        {
            switch (Event.Type)
            {
            case sf::Event::Closed:
                Window->Close();
                break;
            default:
                break;
            }
        }
        
        Window->Clear(sf::Color(0, 255, 255));
        Window->Draw(*pTestSprite);
        Window->Display();



Und zack! Access Violation...
Würde mich wirklich über Hilfe freuen. :)


MFG Dastan

2

30.01.2012, 22:02

Zack! Seid wann macht man sf::RenderWindow als Zeiger? :hmm:
Ebenso wie die Sprites. Normale Instanzen tun es doch auch bzw. hier erst recht.

MfG
Check

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

30.01.2012, 22:04

Zeig mal etwas mehr Code. Vor allem interessant ist wo dein Window deklariert ist, und wo genau es initialisiert wird. Dem Fehler nach greifst du wohl drauf zu bevor der Zeiger noch auf ein richtiges Fenster zeigt...

4

30.01.2012, 22:41

Zitat

Zeig mal etwas mehr Code.


Ich greife über eine Get-Funktion darauf zu:

C-/C++-Quelltext

1
sf::RenderWindow* GetWindow(){return Window;}

(in der .hpp der Klasse)

C-/C++-Quelltext

1
2
3
CGame Game;
sf::RenderWindow *Window;
Window = Game.GetWindow();

(Momentan Testweise in der main)
Und darauf folgt die Abfrage der Events. (siehe Oben)

Mehr gehört leider im Grunde nicht dazu.

Zitat


Zack! Seid wann macht man sf::RenderWindow als Zeiger? :hmm:
Ebenso wie die Sprites. Normale Instanzen tun es doch auch bzw. hier erst recht.


Aber was spricht den dagegen ,ich teile den Code gerne in einzelne Klassen auf und greife dann eben über Zeiger darauf zu. ?(

5

31.01.2012, 01:58

Also das Fenster könntest du z.B. in der Game Klasse kapseln und in der Initialisierungsliste oder mittels sf::RenderWindow::Create erstellen ;)
Dann brauchste auch keine Zeiger, die dich hier nur vor das Problem stellen, den Speicher am Ende wieder freizugeben.

Auch die Sprites könntest du in einer Klasse mit Namen z.B. DrawableObject kapseln, dazu dann noch Sachen wie Positionsangaben usw. .

So hab ich es bei meinem letzten SFML Projekt gemacht.

6

31.01.2012, 10:52

Auch die Sprites könntest du in einer Klasse mit Namen z.B. DrawableObject kapseln, dazu dann noch Sachen wie Positionsangaben usw. .

So hab ich es bei meinem letzten SFML Projekt gemacht.

Ist ja nicht so als hätte die SML so etwas selbst schon.

MfG
Check

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

31.01.2012, 12:25

Debugg einfach mal. Ich wette dein sf::RenderWindow* Window ist eben nicht korrekt initialisiert, zeigt also irgendwohin und nicht auf ein sf::RenderWindow...

8

01.02.2012, 07:03

Zitat

Also das Fenster könntest du z.B. in der Game Klasse kapseln und in der Initialisierungsliste oder mittels sf::RenderWindow::Create erstellen ;)
Dann brauchste auch keine Zeiger, die dich hier nur vor das Problem stellen, den Speicher am Ende wieder freizugeben.

Auch die Sprites könntest du in einer Klasse mit Namen z.B. DrawableObject kapseln, dazu dann noch Sachen wie Positionsangaben usw. .

So hab ich es bei meinem letzten SFML Projekt gemacht.



Ich hoffe das ich "kapseln" richtig interpretier habe aber du meintest damit warscheinlich das ich das Event_Handling und den ganzen quatsch von window in eine Klasse packe.
Also so ungefähr:


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
#include "Game.hpp"

void CGame::init ()
{
    
     Window.Create(sf::VideoMode(800, 600, 32), "SFML Sample Application");
    
     Sprite.load("Background.bmp");
     Sprite.init();
     pTestSprite = Sprite.GetSprite();

}

//Unwichtig

void CGame::Event_handling ()
{

    
        while (Window.IsOpen())
    {

        sf::Event Event;
        while (Window.PollEvent(Event))
        {
            switch (Event.Type)
            {
            case sf::Event::Closed:
                Window.Close();
                break;
            default:
                break;
            }
        }
        
        Window.Clear(sf::Color(0, 255, 255));
        Window.Draw(*pTestSprite); // <----------
        Window.Display();

    }

}



So klappt das ganze zwar aber ich weiß nicht ob das eine all-time-Lösung ist, denn ich werde doch sicherlich später noch mehr mit meinen sf::RenderWindow arbeiten wo ich es nicht in die CGame verschieben kann.
So wie es bei Window.Draw der fall ist das kann ich ja nicht in einer Spriteklasse verpacken weil ich sowohl sf::RenderWindow brauche als auch meinen Sprite (bzw. den dazugehörigen Zeiger).


Zitat

Debugg einfach mal. Ich wette dein sf::RenderWindow* Window ist eben nicht korrekt initialisiert, zeigt also irgendwohin und nicht auf ein sf::RenderWindow...


Bis jetzt hab ich es mit dem Debugger noch nicht rausgekriegt aba ich werds heute nochmal versuchen, wenn ich den Fehlerteufel ausfindig gemacht hab schreib ich euch das aber ich muss jetzt leider los. Wollte noch schnell den Post fertig machen weil ich gestern nicht konnte.

Fröhliches Arbeiten, Dastan :)



EDIT: Ich habs, es war so dumm das es schon fast lustig ist.
Für mich aba wohl eher peinlich. :rolleyes:
Ich habe die Zuweisung (window = new sf::RenderWin...) erst aufgerufen nachdem ich den Zeiger übergeben hab.

Trotzdem denke ich das ich doch durch die Antworten einiges an Wissen mitgenommen hab, also bedanke ich mich nochmal bei allen.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Dastan« (01.02.2012, 21:14)


Werbeanzeige