[英]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.