Problem mit Zeigern



  • Hallo Leute,
    Sorry, dass Ich schon wieder etwas bei euch poste, doch seit Tagen sitze Ich vor der gleichen Fehlermeldung. Das ist der Code:

    class CSki
    {
    friend class CTree;
    private:
    	SDL_Rect     m_rect;
    	SDL_Rect     m_clip[5];
    	SDL_Surface  *m_image;
    
    	int m_angle;
    
    	int m_xSpeed;
    	int m_ySpeed;
    
    	bool m_collided;
    
    	void set_clips();
    public:
    	CSki();
    
    	void show();
    	void move();
    	void handle_events();
    	void reversal(int direction);
    
    	~CSki();
    };
    
    void CSki::set_clips()
    {
    	m_clip[0].x = 0;
    	m_clip[0].y = 0;
    	m_clip[0].w = 45;
    	m_clip[0].h = 65;
    
    	m_clip[1].x = 45;
    	m_clip[1].y = 0;
    	m_clip[1].w = 45;
    	m_clip[1].h = 65;
    
    	m_clip[2].x = 90;
    	m_clip[2].y = 0;
    	m_clip[2].w = 45;
    	m_clip[2].h = 65;
    
    	m_clip[3].x = 135;
    	m_clip[3].y = 0;
    	m_clip[3].w = 45;
    	m_clip[3].h = 65;
    
    	m_clip[4].x = 180;
    	m_clip[4].y = 0;
    	m_clip[4].w = 45;
    	m_clip[4].h = 65;
    
    	m_clip[5].x = 225;
    	m_clip[5].y = 0;
    	m_clip[5].w = 66;
    	m_clip[5].h = 50;
    }
    
    CSki::CSki()
    {
    	m_image = load_image("Skier.png");
    
        m_rect.x = 298;
    	m_rect.y = 100;
    
    	m_angle = 2;
    
    	m_xSpeed = 2;
    	m_ySpeed = 0;
    
    	m_collided = false;
    
    	set_clips();
    }
    
    void CSki::show()
    {	
    	apply_surface(m_rect.x,m_rect.y,m_image,screen); //Diese Zeileverursacht das Problem
    }
    
    void CSki::move()
    {
    	if (!m_collided)
    	{
    	switch (m_angle)
    	{
    	case 0: m_xSpeed = -2; m_ySpeed = 1; break;
    	case 1: m_xSpeed = -1; m_ySpeed = 2; break;
    	case 2: m_xSpeed =  0; m_ySpeed = 3; break;
    	case 3: m_xSpeed =  1; m_ySpeed = 2; break;
    	case 4: m_xSpeed =  2; m_ySpeed = 1; break;
    	}
    
    	m_rect.x += m_xSpeed;
    
    	SCROLLING_SPEED = m_ySpeed;
    
    	if (m_rect.x < 0) {m_rect.x = 0;}
    	if (m_rect.x > SCREEN_WIDTH - m_rect.w) {m_rect.x = SCREEN_WIDTH - m_rect.w;}
    	}
    }
    
    void CSki::reversal(int direction)
    {
    	m_angle += direction;
    
    	if (m_angle > 4) {m_angle=4;}
    	if (m_angle <0) {m_angle=0;}
    }
    
    void CSki::handle_events()
    {
    	if (event.type == SDL_KEYDOWN)
    	{
    		if (event.key.keysym.sym == SDLK_LEFT)
    		{
    			reversal(-1);
    		}
    
    		if (event.key.keysym.sym == SDLK_RIGHT)
    		{
    			reversal(1);
    		}
    	}
    }
    
    CSki::~CSki()
    {
    	SDL_FreeSurface(m_image);
    }
    

    Die markierte Zeile verursacht das Problem. Es liegt daran, dass m_image nicht korrekt geladen wurde. Habt ihr Ideen, wie man das Problem lösen kann?

    Vielen Dank

    /edit pumuckl: BB-Codes aktiviert (sonst bringen die cpp-Tags nichts)



  • Fr0d0 schrieb:

    seit Tagen sitze Ich vor der gleichen Fehlermeldung.

    Die da wäre?

    Aktiviere BBCode in deinem Beitrag.



  • Unbehandelte Ausnahme bei 0x68128c2c in NextTry.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x0000010d.

    Das ist die Fehlermeldung. Habt ihr eine Idee, woran das liegen könnte?



  • SDL_Rect m_clip[5];
    
    m_clip[5].x = 225; 
    m_clip[5].y = 0; 
    m_clip[5].w = 66; 
    m_clip[5].h = 50;
    

    Ist nicht vereinbar, da m_clip mit 5 Elementen nur einen index von 0 bis 4 hat.



  • Ich lerne auch seit ein 4 Monaten C++ aber ist bei dir am Anfang keinen Fehler?

    Bei der Vererbung geht doch anders:

    class CSki : public CTree
    {
    ....



  • Nein Ich leite die Klasse einfack von einer anderen ab. Willkommen im Club- wegen der bisherigen Dauere des C++ lernens.

    Noch einmal eine Frage zu verketten Listen. Bei mir erscheint die Meldung:
    "Unbehandelte Ausnahme bei 0x681109b1 in NextTry.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xfeeefeee."

    Hier der code

    void CGame::move_trees()
    {
    	std::list<CTree>::iterator iter = m_lTreeList.begin();
    
    	for (iter;iter!=m_lTreeList.end();++iter)
    	{
    		if (iter->IsAlive() )
    		{
    			iter->move();
    		}
    
    		else
    		{
    			:arrow_right: m_lTreeList.pop_front();
    		}
    	}
    }
    
    void CGame::show_trees()
    {
    	for (std::list<CTree>::iterator iter = m_lTreeList.begin();iter!=m_lTreeList.end();++iter)
    	{
    		 :arrow_right: iter->show();
    	}
    }
    

    Was mache ich falsch? Ideen? Die Zeilen, die ich auskommentieren muss, damits funzt sind masrkiert.


Anmelden zum Antworten