Du bist nicht angemeldet.

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 375

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 375

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 375

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