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

04.03.2010, 21:02

SDL Fehler - Unerwartetes könnte geschehen?!

Hi Leute,

also ich habe mal versucht den Aufbau für ein Spiel mit der SDL wie im Buch alleine zuschreiben, klappt auch alles nur wenn ich ein simples Bild(*.bmp)
rendern will "sagt" mir der Debugger, dass etwas unerwartetes geschehen könnte XD

Code Sprite.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
23
24
25
26
27
28
29
30
31
#ifndef SPRITE_HPP
#define SPRITE_HPP

#include"Framework.hpp"

class CSprite
{
    public:
        CSprite();
        ~CSprite();

        void Load(const string sFilename);
        void Load(const string sFilename, int FrameNumber, int FrameWidth, int FrameHeight);
        void Render();
        void Render(float fFrameNumber);
        void SetPos(float fXPos, float fYPos);
        void SetColorKey(int R, int G, int B);
        SDL_Rect GetRect() {return(m_Rect);}

    private:
        SDL_Surface *m_pScreen;
        SDL_Surface *m_pImage;
        SDL_Rect m_Rect;
        SDL_Rect m_FrameRect;
        int m_FrameNumber;
        int m_FrameWidth;
        int m_FrameHeight;
        int m_FrameNumberX;
};

#endif 


Code Sprite.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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include"Sprite.hpp"

CSprite::CSprite()
{
    m_pScreen = g_pFramework->GetScreen();
}

CSprite::~CSprite()
{
    SDL_FreeSurface(m_pImage);
}

void CSprite::Load(const string sFilename)
{
    m_pImage = SDL_LoadBMP(sFilename.c_str() );

    if(m_pImage = NULL){
    
        printf("Fehler beim Laden der Datei: %s/n", sFilename.c_str());
        printf("Fehermeldung: %s/n", SDL_GetError());

        g_pFramework->Quit();

        exit(1);
    } else {

        m_Rect.x = 0;
        m_Rect.y = 0;
        m_Rect.w = m_pImage->w; //Hier meckert er

        m_Rect.h = m_pImage->h; //und hier

    }
}

void CSprite::Load(const string sFilename, 
                   int FrameNumber, int FrameWidth, 
                   int FrameHeight)
{
    Load(sFilename);

    m_FrameNumber = FrameNumber;
    m_FrameWidth = FrameWidth;
    m_FrameHeight = FrameHeight;
    m_FrameRect.w = FrameWidth;
    m_FrameRect.h = FrameHeight;
    m_FrameNumberX = m_pImage->w / m_FrameWidth; // hier ebenfalls

}

void CSprite::SetPos(float fXPos, float fYPos)
{
    m_Rect.x = static_cast<int>(fXPos);
    m_Rect.y = static_cast<int>(fYPos);
}

void CSprite::SetColorKey(int R, int G, int B)
{
    SDL_SetColorKey(m_pImage, SDL_SRCCOLORKEY, SDL_MapRGB(m_pImage->format, R, G, B)); //hier auch

}

void CSprite::Render()
{
    SDL_BlitSurface(m_pImage, NULL, m_pScreen, &m_Rect);
}

void CSprite::Render(float fFrameNumber)
{
    int Column = static_cast<int>(fFrameNumber) % m_FrameNumberX;
    int Row = static_cast<int>(fFrameNumber) / m_FrameNumberX;

    m_FrameRect.x = Column * m_FrameWidth;
    m_FrameRect.y = Row * m_FrameHeight;

    SDL_BlitSurface(m_pImage, &m_FrameRect, m_pScreen, &m_Rect);
}


Ich hoffe ihr könnt mir helfen!

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

04.03.2010, 21:08

Zeig mal, was der Compiler genau meldet.

3

04.03.2010, 21:32

Unbehandelte Ausnahme bei 0x012834e9 in Pong_SDL_Engine.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000008.

Sprite.cpp Zeile 35

Das meldet der Debugger wenn ich das Programm ausführe.
Eine Fehlermeldung kommt nicht direckt unten im Ausgabefenster.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

04.03.2010, 21:53

Achtung:

C-/C++-Quelltext

1
if(m_pImage = NULL)


Was ist da dran falsch?

btw:
Der Fehler sagt dir, dass du auf ungültigen Speicher zugreifst, was der Fall ist, wenn du einen 0 Zeiger dereferenzierst.

5

04.03.2010, 21:58

Der soll doch nur x,y,w,h definieren wenn m_pImage gültig ist oder?
Zumindest hab ich das so verstanden.

Aber warum meint der denn, dass der Zeiger 0 ist?
Im Buch ist das genau so abgedruckt.(nur das "else" nicht seh ich grad).

Käsekönig

1x Contest-Sieger

  • Private Nachricht senden

6

04.03.2010, 21:59

drakon hat dir den Fehler ja schon gesagt...

Was machst du in dieser Zeile? ;)
Schau genau.

C-/C++-Quelltext

1
if(m_pImage = NULL)

7

04.03.2010, 22:01

Ohh man ist das peinlich!
Danke Leute :)
Und Heiko hat davor doch auch noch ausdrücklich gewarnt.
Jetzt klappts ;)

Werbeanzeige