SDL- Fehler beim Laden eines Sprites
-
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
-
Da machst du da wohl was falsch.
Bye, TGGC (Das Eine, welches ist.)
-
Hallo
TGGC schrieb:
Da machst du da wohl was falsch.
So weit war ich auch schon. Da du ja gesehen hast, wie cih versuche den string zu übergeben, hast du vielleicht auch noch eine Idee, was ich falsch mache.
chrische
-
Jetzt kommt gleich: "Ja! Bye"
Aber nun dazu...
m_pImage = SDL_LoadBMP("Cubes\\wuerfel_1.bmp");chrische5 schrieb:
...
std::string Temp = "Cubes/" + FileName + lexical_caststd::string(CubeValue) + ".bmp";müsste das nicht "Cubes\" sein statt dem "Cubes/"
und bitte nicht hauen..aber viel mir grad so aufich mein so:
std::string Temp = "Cubes\\" + FileName + lexical_cast<std::string>(CubeValue) + ".bmp";
-
Hallo
1310-Logik schrieb:
Jetzt kommt gleich: "Ja! Bye"
Aber nun dazu...
m_pImage = SDL_LoadBMP("Cubes\\wuerfel_1.bmp");chrische5 schrieb:
...
std::string Temp = "Cubes/" + FileName + lexical_caststd::string(CubeValue) + ".bmp";müsste das nicht "Cubes\" sein statt dem "Cubes/"
und bitte nicht hauen..aber viel mir grad so aufich mein so:
std::string Temp = "Cubes\\" + FileName + lexical_cast<std::string>(CubeValue) + ".bmp";Und ich bekomm trotzdem diesen blöden Fehler. Ich habe es nun auch so probiert (hatte es einfach vorher schon in tausend Varianten versucht) und es passiert genau dasselbe:
Unhandled exception at 0x7c911a30 in Kniffel.exe: 0xC0000005: Access violation reading location 0xcccccccc.
chrische
-
Nimm, doch mal die Zeilen weiter auseinander. Also erst den const char* erzeugen, dann den erstmal noch ausgeben und dann erst damit laden. Muss man dir echt alles erklären?
Bye, TGGC (Das Eine, welches ist.)