SDL_LoadBMP



  • Guten Abend,
    seit heute beschäftige ich mich wieder mit der SDL.
    Die Funktion zum anzeigen eines Bitmaps habe ich bis auf minimale änderungen aus dem sdl intro von libsdl.org übernommen, ich bekomme auch keine kompilierfehler. SDL ist richtig eingerichtet (alles gelinkt etc.)
    und funktioniert auch.
    Die Datei die ich lade ist ein unkomprimiertes bmp und heist auch sicher genau so, sie befindet sich auch im Projekt- sowie Debug- Verzeichniss
    meines MS VC++ 6.0.

    [EDIT]Ich bekomme eine Acces Violattion.[EDIT]
    Ich vermute den Fehler beim blitten.

    #include <iostream>
    using namespace std;
    
    #include <sdl.h>
    #include "SDL_image.h"
    
    #include "ShowIMG.h"// die Headerdatei dieser Funktion
    
    void ShowIMG(char datei[],int x,int y,SDL_Surface *screen)
    {
        SDL_Surface *bild;
        SDL_Rect ziel;
    
        /* lädt die BMP-Datei in ein Surface */
        bild = SDL_LoadBMP(datei);
        if ( bild == NULL ) {
            cout << "Fehler:"<< SDL_GetError()<<endl;
            return;
        }
    
        /* auf den Bildschirm kopieren
           die Surfaces sollten hier nicht gelockt sein. */
        ziel.x = x;
        ziel.y = y;
        ziel.w = bild->w;
        ziel.h = bild->h;
        SDL_BlitSurface(bild, NULL, screen, &ziel);
    
        /* den veränderten Bildschirm-Bereich auffrischen */
        SDL_UpdateRects(screen, 1, &ziel);
    
        SDL_FreeSurface(bild);
    }
    

    Die funktion heißt schon ShowIMG weil ich später auch jpgs... mit sdl_image.h laden will.

    Ich würde mich über hilfe freuen.

    MfG Max



  • Was genau hat das mit mir zu tun?

    Bye, TGGC (Der Held ist zurück)



  • TGGC schrieb:

    Was genau hat das mit mir zu tun?

    Nichts, wieso sollte es etwas mit dir zu tuen haben?

    Hat jemand eine idee wo der Fehler ist?

    MfG Max



  • Master_Max schrieb:

    TGGC schrieb:

    Was genau hat das mit mir zu tun?

    Nichts, wieso sollte es etwas mit dir zu tuen haben?

    Hat jemand eine idee wo der Fehler ist?

    Eben, welcher Fehler denn?

    Bye, TGGC (Der Held ist zurück)



  • Sorry, hatte ich vergessen, oben hin-editet.

    Ich hatte vorher schon den Beitrag versenden wollen,
    klickte auf absenden und der Server ist abgestürzt.

    MfG Max



  • Du greifst auf Speicher zu, der dir nicht gehört.

    Bye, TGGC (Der Held ist zurück)



  • Wo?
    Soll ich ihn dynamisch anfordern?
    Oder meinst du das char array oben im Funktionskopf? // Das habe ich ersetzt, muss aber richtig sein

    MfG Max



  • Er meint die "Access Violation" - die eben genau dieses aussagt... 😉 👍



  • Ja, aber der Code ist ja übernommen, also sollte kein Fehler drin sein.
    Woher könnte es denn kommen?

    MfG Max



  • setzt mal nen breakpoint und schau was genau den fehler verursacht



  • Der Fehler liegt in der Zeile vom blitten.

    MfG Max



  • Master_Max schrieb:

    Ich denke ich habe den Fehler.

    Na komm schon! Sind alle gespannt hier!! 🤡



  • Nein, das war es nicht 😞

    Hier bekomme ich die Acces Violation:

    SDL_BlitSurface(bild, NULL, screen, &ziel);
    

    MfG Max



  • Keine Ahnung. Surfaces gelockt?!
    Was sagen die Vars im Debugger?!



  • Und was sagt die Access Violation?

    Bye, TGGC (Der Held ist zurück)



  • Guten Mittag,
    vielen dank ersteinmal an alle.
    Mir scheint es so als wäre die SDL.dll kaputt.
    Hier also die Fehlermeldungen:

    Microsoft Visual C++ schrieb:

    Unbehandelte Ausnahme in SDLV2.exe (SDL.DLL): 0x000005: Acces Violation

    VocabularyTeacher04: SDLV2.exe-Fehler in Anwendung schrieb:

    Die Anweisung "0x100200ac9" verweist auf Speicher in "0xccccccf8"
    Der Vorgang "read" konnte nicht auf dem Speicher ausgeführt werden.

    Hoffentlich könnt ihr was damit anfangen.
    Vielen dank im voraus.

    MfG Max



  • Guten Mittag,
    Kann es sein das es an dem SDL_Surface Pointer liegt,
    der uninitialiesiert ist?
    Aber das wurde eigentlich überall genauso gemacht.

    MfG Max



  • So, und jetzt suchst du mal den Zeiger, der ungefähr auf ccccccf8 zeigt! Der ist wahrscheinlich nicht initialisiert, da der Speicher im Debug Modus mit 0xcc gefüllt wird. Daran liegt es offensichtlich.

    Bye, TGGC (Der Held ist zurück)



  • Damit du auf ein SDL_Surface blitten kannst, musst du natürlich mit SDL_CreateSurface oder etwas ähnlichem eins allokieren! Auch den Screen musst du mit SDL_SetVideoMode initialisieren.
    geloescht



  • Guten Nachmittag,
    Danke an alle ich habe es hinbekommen:

    class Surface
    {
    private:
    	char *m_data;
    	SDL_Surface *m_screen;
    	SDL_Surface *m_bitmap;
    	SDL_Rect dest;
    public:	
    	Surface::Surface(char *data,int x,int y,SDL_Surface *screen,SDL_Surface *bitmap)
    		:m_data(data),
    	     m_screen(screen),
    		 m_bitmap(bitmap)
    		{
    		dest.x=x;
    		dest.y=y;
    		}
    
    	void Surface::ShowIMG()
    	{
    		m_bitmap=SDL_LoadBMP(m_data);
    
    		dest.w=m_bitmap->w;
    		dest.h=m_bitmap->h;
    
    		SDL_BlitSurface(m_bitmap,0,m_screen,&dest);
    
    		SDL_UpdateRects(m_screen,1,&dest);
    	}
    
    };
    
    int main()
    {
    
    	SDL_Surface *screen,*bitmap;
    
    	SDL_Init(SDL_INIT_VIDEO);	
    
    	screen=SDL_SetVideoMode(1024,768,32,SDL_HWSURFACE);
    
    	Surface VocabularyTeacher("VocabularyTeacher.bmp",0,0,screen,bitmap);
                VocabularyTeacher.ShowIMG();
    
    	SDL_Delay(3000);
    
    	return 0;
    }
    

    Ist noch ein Fehler drin?

    MfG Max


Anmelden zum Antworten