c++ - SDL2 : I Receive Segmentation Fault on Line 5, SDL_表面

标签 c++ c gcc sdl sdl-2

当我运行该程序时,我在第 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)

和 window 有关系吗?

最佳答案

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;
}

关于c++ - SDL2 : I Receive Segmentation Fault on Line 5, SDL_表面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31102757/

相关文章:

C++ 在类中设置数组值

c++ - std::runtime_error::runtime_error(const std::string&) 如何满足 std::exception 对 throw() 的要求?

c++ - C++ 模板的目标代码是否在可执行文件和动态库中重复?

c++ - 'main.cpp :1: No include path in which to find iostream'

c++ - 链接 SDL_image 错误

c++ - 在 iOS 项目中使用 C++

c - 在 C 的回调函数中 fork() 是否安全?

c - 无法从当前位置向后使用 fseek()

htons 中的混淆 - little endian/big endian

c++ - FORTIFY_SOURCE 和 Og 优化级别