2017-01-30 1 views
0

Dies ist nur ein BMP-Bild auf dem SDL-Fenster Front-Puffer anzuzeigen. Ich habe mit dem Code herumgespielt. Und ich denke, dass etwas mit meiner init() Funktion nicht stimmt. Ich bin neu bei SDL. Aber es muss ein Problem mit meinen Zeigern geben oder etwas, das ich an SDLs Funktionen vermisse. EDIT: Ich habe GDB benutzt und es stellte sich heraus, dass meine close() Funktion das Problem war. Ich glaube, es war, weil ich Speicher freigab, der auf NULL gesetzt wurde? Ich habe die nahe Funktion losgeworden und habe nach meiner Verspätungsfunktion nur das Mem freigegeben.Segmentierungsfehler, der SDL2 initialisiert. Was mache ich falsch mit der Erinnerung?

#include <SDL2/SDL.h> 
#include <stdio.h> 
#include <stdbool.h> 
#define SCREENWIDTH 640 
#define SCREENHEIGHT 480 
SDL_Window *win = NULL; 
SDL_Surface *scrn = NULL; 
SDL_Surface *mscrn = NULL; 
bool init() 
{ 
    bool suc = true; 
    char name[11] = "Hello SDL"; 
    if (SDL_Init(SDL_INIT_VIDEO) != 0) { 
    printf("%s", SDL_GetError()); 
    suc = false; 
    } 
    win = SDL_CreateWindow(name, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREENWIDTH, SCREENHEIGHT, SDL_WINDOW_SHOWN); 
    if (win == NULL) { 
    printf("%s", SDL_GetError()); 
    suc = false; 
    } 
scrn = SDL_GetWindowSurface(win); 

return suc; 
} 
bool loadmedia() 
{ 
    bool suc = true; 
    mscrn = SDL_LoadBMP("hello_world.bmp"); 
    if (mscrn == NULL) { 
    printf("%s", SDL_GetError()); 
    suc = false; 
    } 
    return suc; 
} 
void close() 
{ 
    SDL_FreeSurface(mscrn); 
    SDL_DestroyWindow(win); 
    SDL_Quit(); 
} 
int main(int argc, char* args[]) 
{ 
if (!init()) { 
    close(); 
    return 1; 
    } 
    if (!loadmedia()) { 
    close(); 
    return 1; 
    } 
    SDL_BlitSurface(mscrn, NULL, scrn, NULL); 
    SDL_UpdateWindowSurface(win); 
    SDL_Delay(3000); 

    close(); 
    return 0; 
} 
+1

Was sagt Ihr Compiler über 'close()'? – EOF

+0

Was soll "nah" eigentlich schon machen? –

+0

Wild rate: Wenn SDL_Init fehlschlägt, meldest du es (und siehst es nie, weil es keinen abschließenden Zeilenumbruch und somit keinen impliziten Flush gibt), aber marschiere weiter und versuche trotzdem, ein Fenster zu erstellen. Ebenso mit der Fensteroberfläche. Ein * Debugger * ist an dieser Stelle im Menü. – WhozCraig

Antwort

3

Sie sollten einen angemessenen Debugger und andere Tools finden, um zu erfahren, welche Linie den Fehler verursacht und warum. Im Grunde läuft es auf die Verwendung eines Debuggers, der normalerweise mit Ihrer IDE geliefert wird, wenn Sie einen verwenden, oder mit Valgrind, dem sehr guten Code-Analyse-Tool.

Wenn Sie gcc verwenden, können Sie wahrscheinlich gdb verwenden, um Ihr Programm leicht zu debuggen. Hier sind einige Ressourcen, wie Sie helfen Segmentierungsfehler zu diagnostizieren:

Machen Sie sich mit diesen Werkzeugen, wie sie Ihnen unzählige Stunden in die Zukunft zu retten, wenn Sie neues Gesicht Probleme.

+0

Vielen Dank! gdb hat mich immer verwirrt, bis ich auf den Link geklickt habe und den "backtrace" -Befehl gelernt habe – ZhangBing