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

27.05.2012, 22:18

C++ - SFML - 2D Spielchen - Problem - Zugriffsverletzung

Hallo liebe Community!
Hab mich seit ein paar Tagen wieder an C++ gewaagt ;) Nun hab ich ein Problemchen: Zugriffsverletzung!
Ich arbeite mit der Bibliothek SFML, achja und es ist ein kleines 2D Spiel :)

Nun also hier liegt der Fehler:

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

#include <SFML\Graphics.hpp>

class CTile
{
public:
    ~CTile();
    void InitByAmount(sf::Image &Image, int amountX, int amountY, float xPos, float yPos, bool StepOn);
    void InitByPixel(sf::Image &Image, int FrameHeight, int FrameWidth, float xPos, float yPos, bool StepOn);
    void SetTilePos(int lineX, int lineY);
    void Draw(sf::RenderWindow &Window);
    bool GetStepOn(){return stepOn;}
    void SetStepOn(bool stepon){stepOn = stepon;}
    float getXPos(){return x;}
    float getYPos(){return y;}
    int getFrameHeight(){return FrameHeight;}
    int getFrameWidth(){return FrameWidth;}
    int getFrameX(){return FrameX;}
    int getFrameY(){return FrameY;}
    void FlipX();
    void FlipY();
    int getFlipX(){return flipX;}
    int getFlipY(){return flipY;}
    sf::Sprite& getSprite(){return TileSprite;}
    void setSwim(bool swimming){swim = swimming;}
    bool getSwim(){return swim;}// <- Fehler Zugriffsverletzung
    bool getPlayerON(){return playerON;}
    void setPlayerON(bool isPlayerOn){playerON = isPlayerOn;}
private:
    sf::Sprite TileSprite;
    int flipX, flipY;
    float x, y;
    int FrameHeight, FrameWidth;
    int FrameX, FrameY;
    bool stepOn;
    bool swim;
    bool playerON;
};

#endif


Fehler:

Zitat

Eine Ausnahme (erste Chance) bei 0x00c17606 in 2D.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x000000e5.
Unbehandelte Ausnahme bei 0x00c17606 in 2D.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x000000e5.
Vielen Dank im voraus ;)
Only God can judge me.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

27.05.2012, 22:25

Mit diesem Code können wir nichts anfangen.
Es fehlt das "Drumherum": wie wird diese Klasse benutzt? Wo wird die Methode aufgerufen?

3

27.05.2012, 22:32

So mittlerweile weiß ich wo das Problem liegt, aber mir fällt keine Lösung ein:
Hier:

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
//Speicher freigeben
void CEditor::Destroy(std::vector<std::vector<CTile*> > &Vector)
{
    for(int i = 0; i < length; i++)
    {
        for(int j = 0; j < length; j++)
        {
            if(vecTiles[i][j] != NULL)
            {
                Vector[i][j]->SetTilePos(vecTiles[i][j]->getFrameX(), vecTiles[i][j]->getFrameY());
                Vector[i][j]->SetStepOn(vecTiles[i][j]->GetStepOn());
                if(vecTiles[i][j]->getFlipX() == 1 && Vector[i][j]->getFlipX() != 1)
                    Vector[i][j]->FlipX();
                else if(vecTiles[i][j]->getFlipX() == 0 && Vector[i][j]->getFlipX() == 1)
                    Vector[i][j]->FlipX();
                if(vecTiles[i][j]->getFlipY() == 1 && Vector[i][j]->getFlipY() != 1)
                    Vector[i][j]->FlipY();
                else if(vecTiles[i][j]->getFlipY() == 0 && Vector[i][j]->getFlipY() == 1)
                    Vector[i][j]->FlipY();
                if(vecTiles[i][j]->getSwim())
                    Vector[i][j]->setSwim(true);
                else
                    Vector[i][j]->setSwim(false);
                delete vecTiles[i][j];
            }
        }
    }
}
Only God can judge me.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

27.05.2012, 22:34

Wahrscheinlich greifst du auf eine bereits gelöschte oder noch nicht erzeugte Instanz zu, d.h. über einen ungültigen Pointer.
Ich rate dir außerdem dringend deinen Code aufzuräumen. Bei dem ganzen [i][j] wird man ja bekloppt. Eine einfache temporäre Variable hilft.

5

27.05.2012, 23:08

Okey vielen Dank, Problem gelöst ;)

Was ist denn eine einfache temporäre Variable o.O ?

Lg. denniro
Only God can judge me.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

27.05.2012, 23:19

Anstatt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
Vector[i][j].Something();
Vector[i][j].Something();
Vector[i][j].Something();
Vector[i][j].Something();
Vector[i][j].Something();
Vector[i][j].Something();
Vector[i][j].Something();
Vector[i][j].Something();


benutzt du:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
X& x = Vector[i][j];
x.Something();
x.Something();
x.Something();
x.Something();
x.Something();
x.Something();
x.Something();
x.Something();

7

28.05.2012, 10:31

Anstatt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
Vector[i][j].Something();
Vector[i][j].Something();
Vector[i][j].Something();
Vector[i][j].Something();
Vector[i][j].Something();
Vector[i][j].Something();
Vector[i][j].Something();
Vector[i][j].Something();


benutzt du:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
X& x = Vector[i][j];
x.Something();
x.Something();
x.Something();
x.Something();
x.Something();
x.Something();
x.Something();
x.Something();



okey darauf wäre ich nie im leben gekommen! DANKE DIR :)
Only God can judge me.

Werbeanzeige