C++ Fehler: Unbehandelte Ausnahme

Abcd12345

Lt. Junior Grade
Registriert
März 2006
Beiträge
483
Hi,

Ich habe ein Schwerwiegendes Problem. Wenn ich mein Programm starten möchte bekomme ich einen Ausnahmefehler. Könnte mir vieleicht jemand sagen, was ich dagegen machen kann?

Follgender Fehler:

Unbehandelte Ausnahme bei 0x10022c4f in Super_Engine_01.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x0f452452.

Also es ist kein Kompelierungsfehler sondern er tritt erst auf wenn ich versuche das Spiel zu starten und wird durch ein WIndowsfenster mit einem Ausrufezeichen ausgegeben.

Ich hab zwar eine ältere Version meines Programms als Sicherheitskopie allerdings wären dann mehrere Stunden arbeit dahin :( daher wüsste ich schon gerne, wo die Fehlerursache ist.

Würde mich über Hilfe freuen :)


Edit:




Ich hab das Programm im Debugmodus durchlaufen lassen.

Als das Programm gecrascht ist, war er grade anscheinend in dieser Funktion:
Code (C++):

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

} // SetColorKey



Code:
Ein Grüner Pfeil zeigte auf:
Code (C++):
  SDL_MapRGB (m_pImage->format, R, G, B) );
 
Zuletzt bearbeitet:
Typischer Fehler. Passier mir auch ständig.
Aus unerfindlichen Gründen wollen meine Programme auch ständig schreibend auf die Adresse 0x0f452452 zugreifen.
Echt blöde Sache :(.
Wenn ich nur wüsste wieso?

Ein Kollege in der Firma hat mir da mal einen Tipp gegeben.
Es gibt da so Programme mit denen man zur Laufzeit nachschauen kann, was die Programme so machen.
Die werden Debugger genannt.
Wenn du das Programm selbst geschrieben hast (und das geht aus deinem Beitrag so hervor) dann solltest du das eigentlich wissen ;).

[edit]
Schön. Selbst draufgekommen :).

Ist das Element format vom Objekt m_pImage auch ein Zeiger?
Laut API-Doku muss das erste Argument von SDL_MapRGB(...) ein Zeiger auf ein SDL_PixelFormat sein: http://docs.mandragor.org/files/Com...L/SDL_Documentation_project_en/sdlmaprgb.html
 
Zuletzt bearbeitet:
Hi,

Natürlich kenne ich den Debugger habe ihn ja jetzt auch benutzt siehe mein Edit oben. Leider wurde ich noch nie mit einem derartigen Fehler konfrontiert und bin deshalb jetzt etwas hilflos, wie ich dagegen Vorgehen soll.

Hier ist der Header der zugehörigen Klasse:

Code:
#ifndef SPRITE_HPP
#define SPRITE_HPP

#include "Framework.h"

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

    void Load        (const string sFilename);
    void Load        (const string sFilename, int NumFrames,
                      int FrameWidth, int FrameHeight);
	void Load_Backgroundmap (const string Filename,int FrameWidth, int FrameHeight);

    void SetColorKey (int R, int G, int B);
    void SetPos      (float fXPos, float fYPos);
    
	void Render      ();
    void Render      (float fFrameNumber);
	void Render_BackgroundMap (class CPlayer &Koordinaten);
	void Render_Gegner  (float fFrameNumber, int XScreenMin, int XScreenMax, int YScreenMin, int YScreenMax,  int X1, int Y1 );

    SDL_Rect GetRect () {return m_Rect;}

  private:
    SDL_Surface *m_pScreen; // Zeiger auf den Screen des Frameworks
    SDL_Surface *m_pImage;  // Das eigentliche Bild des Sprites
    SDL_Rect m_Rect;        // Rect des Sprites
    SDL_Rect m_FrameRect;   // Ausschnitt für Animationsphase
    int m_NumFrames;        // Anzahl der Animationsphasen
    int m_FrameWidth;       // Breite einer Animationsphase
    int m_FrameHeight;      // Höhe einer Animationsphase
    int m_NumFramesX;		// Wie viele Anim-Phasen in X-Richtung?
	int m_bXArea;			// SPeichert ob der Gegner im X Bereich ist
	int	m_bYArea;			// Speichert ob der Gegner im Y Bereich ist		
};

#endif

Und hier ist die Funktion um das Bild zu speichern:

Code:
// Load
//
// Aufgabe: Einfaches, nicht animiertes Sprite laden
//
void CSprite::Load (const string sFilename)
{
  // Bitmap laden
  m_pImage = SDL_LoadBMP (sFilename.c_str());

  // Prüfen, ob alles glatt ging
  if (m_pImage == NULL)
  {
    cout << "Fehler beim Laden von: " << sFilename.c_str();
    cout << endl;
    cout << "Fehlermeldung: " << SDL_GetError () << endl;

    // Framework herunterfahren
    g_pFramework->Quit ();

    // Gesamtes Spiel beenden
    exit (1);
  }

Ich bin ziemlich ratlos zumal die Funktion in den früheren Version völlig Problemlos funktioniert hat..
 
Zuletzt bearbeitet:
Hast du eine Debugversion der SDL installiert?
Dann könntest du in die Funktion SDL_SetColorKey(), bzw. SDL_MapRGB(), "steppen". So bekommst du noch genauer raus, wo der Zugriff stattfindet.
 
Ich bin mir nicht sicher ob ich eine Debuggfunktion der SDL instaliert habe, wo kann ich das denn nachschauen?

Und wie kann ich damit dann die Funktion genauer durchgehen?
 
Na du gehtst mit dem Debugger bis in die Funktion SetColorKey(). Un darin dann "in" die Funktion SDL_SetColorKey(). Mit Einzelschritten dann weiter bis es kracht.
 
Ich hab den Fehler jetzt gefunden anscheinend mochte das Programm den Aufruf der Funktion nicht an einer bestimmten Stelle weshalb ich die Positionsänderung jetzt einfach an einer andern Stelle gemacht habe, was funktioniert.
Ich verstehe zwar nicht genau wieso und warum das so ist, aber zumindest läuft mein Spiel jetzt wieder :)

Danke für die Unterstützung :)
 
anscheinend mochte das Programm den Aufruf der Funktion nicht an einer bestimmten Stelle weshalb ich die Positionsänderung jetzt einfach an einer andern Stelle gemacht habe, was funktioniert.
http://en.wikipedia.org/wiki/Shotgun_debugging
http://en.wikipedia.org/wiki/Programming_by_permutation
http://en.wikipedia.org/wiki/Voodoo_programming

€: Ach lies einfach direkt
http://en.wikipedia.org/wiki/Anti-pattern und
http://en.wikipedia.org/wiki/Category:Anti-patterns
 
Zuletzt bearbeitet:
Unbehandelte Ausnahme bei 0x10022c4f in Super_Engine_01.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x0f452452.

Heißt:

Dein Programm versucht auf einen Speicherbereich zuzugreifen, der dem Programm nicht zugewiesen wurde. Soetwas passiert üblicherweise bei uninitialisierten Zeigern.

Nun könnte m_pImage ungültig sein, oder auch m_pImage->format.

Das jetzt herauszufinden liegt jetzt bei Dir - kannst ja die "Tools" benutzen, die oben genannt wurden :D
 
Zurück
Oben