Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

05.04.2015, 13:40

SDL_BlitScaled übergiebt einen NULL ptr

Hallo Community,

ich arbeite mich momentant durch die Lazyfoo Tutorialreihe zu SDL_2 durch und habe mir als Ziel gesetzt, eine Funktion zu schreiben, welche eine Datei in falscher Größe zuerst auf das gesamte Fenster streckt und dieses gestreckte Bild anschließend optimiert, indem es dieses auf das Format des Fensters konvertiert.

Leider bekomme ich von der SDL_BlitScaled Funktion nur einen Nullptr. Hier ist die genaue Fehlermeldung:

Zitat

sdl_upperblit passed a null surface
Hier die Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
SDL_Surface* loadBMPandResize(const std::string& dataPath, const SDL_Surface* const mainWindowSurface)
{
    SDL_Rect tempRect;
    SDL_Surface* tempSurface = NULL;
    SDL_Surface* tempSurface_2 = NULL;
    SDL_Surface* optimizedTempSurface_2 = NULL;

    // Ein Rechteck in der Größe des gesamten Fensters erstellen
    tempRect.x = 0;
    tempRect.y = 0;
    tempRect.h = SCREEN_HEIGHT;
    tempRect.w = SCREEN_WIDTH;

    // Laden der BMP Datei vom übergebenen Datenpfad (Das Laden der Datei ist erfolgreich)
    tempSurface = SDL_LoadBMP(dataPath.c_str());
    if (tempSurface == NULL)
    {
        std::cout << "Laden der Datei in die Surface ist fehlgeschlagen. SDL_Error:\n" << SDL_GetError() << std::endl;
    }
    else
    {
        // Skalierung der Datei auf die Größe des Rechtecks sowie die übergabe des skalierten Rechtecks an tempSurface_2
        SDL_BlitScaled(tempSurface, NULL, tempSurface_2, &tempRect);
        // Speicherfreigabe von tempSurface, da das skalierte Bild nun in tempSurface_2 gespeichert sein sollte
        SDL_FreeSurface(tempSurface);
        tempSurface = NULL;
        // tempSurface_2 ist immer noch ein nullptr, denn hier tritt der Fehler auf.
        if (tempSurface_2 == NULL)
        {
            std::cout << "Skalierung der Datei fehlgeschlagen. SDL_Error:\n" << SDL_GetError() << std::endl;
        }
        // Dieser Teil des Codes soll anschließend die skalierte Datei optimieren, indem es dieses auf das Format des Fensters konvertiert
        else
        {
            optimizedTempSurface_2 = SDL_ConvertSurface(tempSurface_2, mainWindowSurface->format, NULL);
            SDL_FreeSurface(tempSurface_2);
            tempSurface_2 = NULL;

            if (optimizedTempSurface_2 == NULL)
            {
                std::cout << "Optimierung der Datei fehlgeschlagen. SDL_Error:\n" << SDL_GetError() << std::endl;
            }
        }
    }

    return optimizedTempSurface_2;
}


Ich glaube, dass ich hier etwas schrecklich offensichtliches übersehen habe :rolleyes: .

Ich hoffe jemand kann mir erklären, was dort falsch läuft und wie ich das am besten beheben kann.

Lg und viele Dank für eure Zeit

pouk_

Frischling

Beiträge: 64

Beruf: Schüler

  • Private Nachricht senden

2

05.04.2015, 13:48

C-/C++-Quelltext

1
SDL_BlitScaled(tempSurface, NULL, tempSurface_2, &tempRect);

tempSurface_2 wurde davor doch nur mit NULL initialisiert ? tempSurface_2 sollte schon nicht NULL sein, sondern ein Surface. Ich glaube du willst das Surface vom Window^^. ( SDL_GetWindowSurface( SDL_Window* win ) um das Surface zu bekommen )

C-/C++-Quelltext

1
2
#include <stdlib.h>
main(){for(;;malloc(1024));} // dead

3

05.04.2015, 16:31

Ahh natürlich, das Ganze wird schon direkt geblitet :| .

Ich bin davon ausgegangen, dass damit nur die Größe verändert wird und habe die Tatsache total ignoriert, dass das ganze auch versucht irgendwo anwendung zu finden :pillepalle: .

Vielen dank ... das hat so einiges geklärt :) !

Werbeanzeige