繁体   English   中英

SDL2:我在第 5 行 SDL_Surface 上收到分段错误

[英]SDL2: I Receive Segmentation Fault on Line 5, SDL_Surface

当我运行程序时,第 5 行出现分段错误,即获取窗口表面的 SDL_Surface 指针。 这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include "SDL2/SDL.h"
SDL_Window* window=NULL;
SDL_Surface* MainSurface=NULL;
SDL_Surface* ImageSurface=NULL;
void ifdebug(int pmbool,const char* str){
    if(pmbool==1){
        printf(str);
    }
}
void NewWindow(int x,int y,int pmbool){
    ifdebug(pmbool,"DEBUG^");
    SDL_Init(SDL_INIT_VIDEO);
    SDL_Event MainEvent;
    int IsRunning=1;
    window=SDL_CreateWindow("SDL2: Window",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,x,y,SDL_WINDOW_SHOWN);
    if(window==NULL){
        ifdebug(pmbool,"WINDOW:ERROR<<");
        ifdebug(pmbool,SDL_GetError());
        ifdebug(pmbool,">>#\n");
        SDL_FreeSurface(ImageSurface);
        ImageSurface=NULL;
        SDL_DestroyWindow(window);
        window=NULL;
        SDL_Quit();
    }
    else{
        ifdebug(pmbool,"WINDOW:SUCCESS^");
    }
    MainSurface=SDL_GetWindowSurface(window);
    while(IsRunning){
        if(SDL_PollEvent(&MainEvent)!=0){
            if(MainEvent.type==SDL_QUIT){
                ifdebug(pmbool,"QUIT#\n");
                IsRunning=0;
                SDL_FreeSurface(ImageSurface);
                ImageSurface=NULL;
                SDL_DestroyWindow(window);
                window=NULL;
                SDL_Quit();
            }
        }
    }
}
void LoadImage(int pmbool,char* filename){
    ImageSurface=SDL_LoadBMP(filename);
    if(ImageSurface==NULL||filename==NULL){
        ifdebug(pmbool,"DEBUG^");
        ifdebug(pmbool,"LOADBMP:ERROR<<");
        ifdebug(pmbool,SDL_GetError());
        ifdebug(pmbool,">>#\n");
        SDL_FreeSurface(ImageSurface);
        ImageSurface=NULL;
        SDL_DestroyWindow(window);
        window=NULL;
        SDL_Quit();
    }
}
int main(int argc,char* args[]){
    NewWindow(600,400,1);
    LoadImage(1,"/home/vlad/Desktop/C-lang/BLU.bmp");
    SDL_BlitSurface(ImageSurface,NULL,MainSurface,NULL);
    SDL_UpdateWindowSurface(window);
    return 0;
}

这是错误:

Line 5: 9029 (Core Dumped)

和窗户有关系吗?

OP修复了它。 原来是关闭窗口的函数阻止了它的加载。 这是固定代码:

#include <stdio.h>
#include <stdlib.h>
#include "SDL2/SDL.h"
SDL_Window* window=NULL;
SDL_Surface* MainSurface=NULL;
SDL_Surface* ImageSurface=NULL;
SDL_Event MainEvent;
void ifdebug(int pmbool,const char* str){
    if(pmbool==1){
        printf(str);
    }
}
void InitWindow(int x,int y,int pmbool){
    ifdebug(pmbool,"DEBUG^");
    SDL_Init(SDL_INIT_VIDEO);
    window=SDL_CreateWindow("SDL2: Window",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,x,y,SDL_WINDOW_SHOWN);
    if(window==NULL){
        ifdebug(pmbool,"WINDOW:ERROR<<");
        ifdebug(pmbool,SDL_GetError());
        ifdebug(pmbool,">>#\n");
        SDL_DestroyWindow(window);
        window=NULL;
        SDL_Quit();
    }
    else{
        ifdebug(pmbool,"WINDOW:SUCCESS^");
    }
}
void LoadImage(int pmbool,char* filename){
    MainSurface=SDL_GetWindowSurface(window);
    ImageSurface=SDL_LoadBMP(filename);
    if(ImageSurface==NULL){
        ifdebug(pmbool,"WINDOW:ERROR<<");
        ifdebug(pmbool,SDL_GetError());
        ifdebug(pmbool,">>#\n");
        SDL_DestroyWindow(window);
        window=NULL;
        SDL_Quit();
    }
    SDL_BlitSurface(ImageSurface,NULL,MainSurface,NULL);
    SDL_UpdateWindowSurface(window);
}
void InputGet(int pmbool){
    int IsRunning=1;
    while(IsRunning){
        if(SDL_PollEvent(&MainEvent)!=0){
            if(MainEvent.type==SDL_QUIT){
                ifdebug(pmbool,"QUIT#\n");
                IsRunning=0;
                SDL_DestroyWindow(window);
                window=NULL;
                SDL_FreeSurface(ImageSurface);
                SDL_Quit();
            }
        }
    }
}
int main(int argc,char* args[]){
    InitWindow(600,400,1);
    LoadImage(1,"/home/vlad/Desktop/C-lang/BLU.bmp");
    InputGet(1);
    SDL_UpdateWindowSurface(window);
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM