SDL- Fehler beim Laden eines Sprites
-
Hallo
Ich habe einen Fehler, den ich mit nicht erklären kann. Sonst würde ich hier ja auch nicht fragen. Also ich habe eine Klasse Sprite und in dieser eine Funktion Namens Load, der ich ein std::string übergebe. Nun möchte ich ein Bitmap laden und zwar so:
m_pImage = SDL_LoadBMP(p_strFileName.c_str());Ich bekomme jetzt immer folgende Fehlermeldung:
Unhandled exception at 0x7c911a30 in SDL_FussballManager.exe: 0xC0000005: Access violation reading location 0x8a224b85.
Ich weiß ehrlich gesagt, nicht warum. Im Debugger steht für p_strFilename immer: bad Ptr, was wohl bad pointer heißen soll.
So sieht der Aufruf der Funktion aus:
MouseCursor.Load("mouse/MouseCursor.bmp");Die Datei ist auch vorhanden.
chrische
-
Zeig mal ein bisschen mehr von der Load methode
warum gehst nimst du string da SDL_LoadBMP() wiseo const char* will ?
ist doch praktischer der Load methode auch gleich const char* zu geben
-
Hallo
KingOfTheBlueMouse schrieb:
Zeig mal ein bisschen mehr von der Load methode
Hier die ganze Methode:
void Sprite::Load(const std::string p_strFileName) { //Bitmap laden m_pImage = SDL_LoadBMP(p_strFileName.c_str()); //Prüfen ob alles glatt ging if(m_pImage == NULL) { Logfile::Get()->WriteTopic("Laden des Bitmaps",3); Logfile::Get()->TextOut("Laden des Bitmaps ist fehlgeschlagen<br>"); Framework::Get()->Quit(); exit(1); } //Rect initialisieren m_Rect.x = 0; m_Rect.y = 0; m_Rect.w = static_cast<Uint16>(m_pImage->w); m_Rect.h = static_cast<Uint16>(m_pImage->h); }Das ganze lief auch schon mal, aber cih weiß ehrlich gesagt nicht, was jetzt anders ist als vorher.
KingOfTheBlueMouse schrieb:
warum gehst nimst du string da SDL_LoadBMP() wiseo const char* will ?
ist doch praktischer der Load methode auch gleich const char* zu gebenIch arbeite lieber mir strings und programmiere außerdem c++ und nicht c.

chrische
-
Hallo
Verzeihung, dass ich schon schiebe, aber weiß keiner eine Lösung. Ich habe jetzt mal geschut und einem alten Projekt funktioniert genau diese Loadfunktion. Ich habe das nun alles in eine Bibliothek geschmissen und nun funzt es nicht mehr.
chrische
-
Ich gebe zu ich hatte mal einen ähnlichen fehler ...
sogar schon 2 mal aber nach einiger zeit musste ich dann immer aufgeben
hilft dir zwar nicht aber ich wohlte es mal erwähnt haben
-
hi,
vielleicht solltest du dich mal schrittweise dem problem naehern. setz doch mal einen string direkt in die sdl_loadbmp ein und schau dann was passiert. womoeglich liegt es nicht an sdl sondern wie schon beschrieben am string.
gruss
msp
-
Hi,
ist denn der Pointer m_pImage vorher irgendwie definiert und oder initialisiert worden z.B mit:
SDL_Surface* m_pImage = NULL;Gruß Chris
-
Hall0
justchris schrieb:
Hi,
ist denn der Pointer m_pImage vorher irgendwie definiert und oder initialisiert worden z.B mit:
SDL_Surface* m_pImage = NULL;Gruß Chris
Also m_pImage wird im C'tor der Klasse mit NULL initialisiert.
Ich habe die Bibliothek und damit auch die Klasse nun noch einmal in einem anderen Projekt verwendet und da bekomme ich folgenden Fehler:
A buffer overrun has occurred in Kniffel.exe which has corrupted the program's internal state. Press Break to debug the program or Continue to terminate the program. For more details please see Help topic 'How to debug Buffer Overrun Issues'.Die Klasse hat einwandfrei funktioniert, so lange ich sie einfach zum Projekt hinzugefügt habe. Nun mit der Bibliothek gibt es Probleme. Kann diese vielleicht auch mit folgenden Warnungen zusammenhängen:
Warning 1 warning LNK4075: ignoring '/INCREMENTAL' due to '/LTCG' specification Kniffel
Warning 2 warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library MSVCRTD.lib
Ich bin langsam wirklich ein bisschen genervt und verzweifelt.
chrische
-
Hallo
Es muss doch eine Lösung für das Problem geben. Weiß denn niemand Rat?
chrische
-
Hmm, bin da auch ratlos ich habe noch nie eine eigene Lib gemacht. Ich bin grad dabei mein erstes kleines Spiel zu schreiben und habe mir auch ein Spriteklasse mit einer load methode geschrieben. Auch ich übergebe der Methode einen string für den Dateinamen...
-
Warum debuggest du nicht mal durch und schaust wo genau der "bad pointer" ist? Dann hättest du den String vielleicht schonmal zu einer Referenz gemacht. f'`8k
Bye, TGGC (Das Eine, welches ist.)
-
Hallo
Ich habe jetzt den string zu einer Referenz gemacht und es passiert folgendes:
Unhandled exception at 0x7c911a30 in Kniffel.exe: 0xC0000005: Access violation reading location 0xcccccccc.
Jetzt habe ich das mal mit dem Debugger verfolgt:
erster Funktionsaufruf:
std::string Temp = "Cubes/" + FileName + lexical_cast<std::string>(CubeValue) + ".bmp"; CubePicture.Init(Temp, PosX, PosY, 90, 90);auf weiter geklickt.
In der Init von CubePicture:
void SpriteObject::Init(const std::string& strBitmapName, unsigned int p_uiPosX, unsigned int p_uiPosY, unsigned int p_uiWidht, unsigned int p_uiHeight) { m_pSprite = new Sprite; m_pSprite->Load(strBitmapName); m_Rect.x = p_uiPosX; m_Rect.y = p_uiPosY; m_Rect.w = p_uiWidht; m_Rect.h = p_uiHeight; }strBitmapName ist hier übrigens genau wie vermutete: "Cubes\wuerfel_1.bmp"
Also alles in Ordnung. Nun die Loadfunktion von m_pSprite:void Sprite::Load(const std::string& p_strFileName) { //Bitmap laden m_pImage = SDL_LoadBMP(p_strFileName.c_str()); //Prüfen ob alles glatt ging if(m_pImage == NULL) { Logfile::Get()->WriteTopic("Laden des Bitmaps",3); Logfile::Get()->TextOut("Laden des Bitmaps ist fehlgeschlagen<br>"); Framework::Get()->Quit(); exit(1); } //Rect initialisieren m_Rect.x = 0; m_Rect.y = 0; m_Rect.w = static_cast<Uint16>(m_pImage->w); m_Rect.h = static_cast<Uint16>(m_pImage->h); }Wenn ich mir hier allerdings p_strFileName anschauen möchte, dann steht folgendes im Debugger:
+ p_strFileName {_Bx={...} _Mysize=??? _Myres=??? } const std::basic_string<char,std::char_traits<char>,std::allocator<char> > &Ds bedeutet ja wohl soviel, wie der string ist leer. Wie kann das gehen? Sitze ich auf meinen Augen?
chrische
-
Hat die dll denn überhaupt Debug Informationen? Und wo genau fängt die dll denn an? Innerhalb der dll sollte das Herumreichen von strings ja wiederum klappen.
Bye, TGGC (Das Eine, welches ist.)
-
Hallo
Ich arbeite mit einer statischen Bibliothek. Die Klassen Sprite und SpriteObjct stehen beide in der Bibliothek. Natürlich noch ein paat mehr, aber das sind ja wohl die entscheidenden Klassen. Das mit den Debuginformationen verstehe ich ehrlich gesagt nicht.
chrische
-
Was gibts da nicht zu verstehen? Hast du die Compiler nund Linkeroptionen für die DebugInfos an oder nicht? Ausserdem hast du immer noch nicht gesagt, wo der Fehler überhaup auftritt, denn mit der Speicheradresse kann hier bestimmt keiner was anfangen. Mit dem std::string hat das Ganz doch dann wohl überhaupt nichts zu tun.
BTW: Mit "SDL_Surface* m_pImage = NULL;" im Ctor initialisiert du überhaupt keine Klassenvariable. Du erstellst nur eine lokale.
Bye, TGGC (Das Eine, welches ist.)
-
Hallo
Also ich compiliere im Debug-Modus. Wo der Fehler auftritt, habe cih doch schon gesagt und zwar genau bei dieser Zeile:
m_pImage = SDL_LoadBMP(p_strFileName.c_str());m_pImage ist doch eine Membervariable von Sprite, die ich ihm C'tor mittels der Initialisierungsliste initialisiere.
chrische
-
Dann lass halt die Zeile weg.
msp schrieb:
hi,
vielleicht solltest du dich mal schrittweise dem problem naehern. setz doch mal einen string direkt in die sdl_loadbmp ein und schau dann was passiert. womoeglich liegt es nicht an sdl sondern wie schon beschrieben am string.
gruss
mspBye, TGGC (Das Eine, welches ist.)
-
Hallo
Also ich habe nun den Rat befolgt und siehe da: Es klappt. Da freut mich zwar, aber bringt mich nur bedingt weiter, weil ich ja schon einen string übergeben muss. Also habt ihr vielleicht dazu noch Ideen?
chrische
-
chrische5 schrieb:
Hallo
Also ich habe nun den Rat befolgt und siehe da: Es klappt. Da freut mich zwar, aber bringt mich nur bedingt weiter, weil ich ja schon einen string übergeben muss. Also habt ihr vielleicht dazu noch Ideen?
chrische

was hast du jetzt geändert?
-
Hallo
Ich habe den string zwar noch übergeben, aber gleich
m_pImage = SDL_LoadBMP("Cubes\\wuerfel_1.bmp");geschrieben und dann wurde das Bitmap geladen. Das kann ja nun aber nicht die Endlösung sein, da man ja schon den Namen übergeben können muss.
chrische