C++ 程序立即关闭SDL

C++ 程序立即关闭SDL,c++,sdl,exit,shutdown,C++,Sdl,Exit,Shutdown,当我运行这段代码(来自Lazy Foo SDL教程)时,程序立即关闭。为什么呢?我很抱歉,如果因为缺少评论而变得混乱,但我认为这并不重要,因为Lazy Foo的帖子上有评论。我在构建它时没有错误 #include "SDL/SDL_image.h" #include "SDL/SDL.h" #include <string> const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; const int SCREEN

当我运行这段代码(来自Lazy Foo SDL教程)时,程序立即关闭。为什么呢?我很抱歉,如果因为缺少评论而变得混乱,但我认为这并不重要,因为Lazy Foo的帖子上有评论。我在构建它时没有错误

#include "SDL/SDL_image.h"
#include "SDL/SDL.h"
#include <string>


const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

const int SCREEN_BPP = 32;

SDL_Surface *image = NULL;
SDL_Surface *screen = NULL;
SDL_Event event;

SDL_Surface *load_image (std::string filename)
{
SDL_Surface* loadedImage = NULL;
SDL_Surface* optimizedImage = NULL;
loadedImage = IMG_Load( filename.c_str());
if(loadedImage != NULL)
{
    optimizedImage = SDL_DisplayFormat (loadedImage);
    SDL_FreeSurface(loadedImage);
}
return optimizedImage;

}
void apply_surface (int x, int y, SDL_Surface* source, SDL_Surface* destination)
{
SDL_Rect offset;
offset.x = x;
offset.y = y;
SDL_BlitSurface (source, NULL, destination, &offset);
}
bool init()
{
if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
{
return false;
}
screen = SDL_SetVideoMode (SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE);
if (screen == NULL)
{
return false;
}
SDL_WM_SetCaption("Event test", NULL);
return true;
}
bool load_files()
{
image = load_image ("background.png");
if (image == NULL)
{
    return false;
}
return true;
}
void clean_up()
{
SDL_FreeSurface(image);
SDL_Quit();
}
int main(int argc, char* args[])
{
bool quit = false;
if (init() == false)
{
return 1;
}
if (load_files() == false)
{
return 1;
}
apply_surface(0,0, image, screen);
if(SDL_Flip(screen) == -1)
{
return 1;
}
while(quit == false)
{
while (SDL_PollEvent(&event))
{
    if(event.type == SDL_QUIT)
    {
        quit = true;
    }
}
}
clean_up();
return 0;
}
#包括“SDL/SDL_image.h”
#包括“SDL/SDL.h”
#包括
屏幕宽度=640;
屏幕上的常数=480;
屏幕常数(BPP=32);
SDL_表面*图像=空;
SDL_表面*屏幕=空;
SDL_事件;
SDL_表面*加载_图像(标准::字符串文件名)
{
SDL_表面*LoadeImage=NULL;
SDL_曲面*optimizedImage=NULL;
LoadeImage=IMG_Load(filename.c_str());
如果(LoadeImage!=NULL)
{
optimizedImage=SDL_显示格式(LoadeImage);
SDL_自由曲面(加载图像);
}
返回优化年龄;
}
void apply_surface(int x,int y,SDL_surface*源,SDL_surface*目标)
{
垂直偏移量;
偏移量x=x;
偏移量y=y;
SDL_BlitSurface(源、空、目标和偏移);
}
boolinit()
{
if(SDL_Init(SDL_Init_EVERYTHING)=-1)
{
返回false;
}
屏幕=SDL_设置视频模式(屏幕宽度、屏幕高度、屏幕BPP、SDL_表面);
如果(屏幕==NULL)
{
返回false;
}
SDL_WM_SetCaption(“事件测试”,空);
返回true;
}
bool load_文件()
{
image=load_image(“background.png”);
if(image==NULL)
{
返回false;
}
返回true;
}
无效清除()
{
SDL_自由曲面(图像);
SDL_退出();
}
int main(int argc,char*args[]
{
bool-quit=false;
if(init()==false)
{
返回1;
}
如果(加载_文件()==false)
{
返回1;
}
应用_表面(0,0,图像,屏幕);
如果(SDL_翻转(屏幕)=-1)
{
返回1;
}
while(quit==false)
{
while(SDL_事件和事件))
{
if(event.type==SDL\u QUIT)
{
退出=真;
}
}
}
清理;
返回0;
}

如果您缺少background.png或可执行目录中任何必需的DLL,您可能会遇到奇怪的崩溃


由于这是本系列中比较简单的程序之一,我敢打赌这就是问题所在。我自己也看到过奇怪的错误,当时我脑子里出了一个屁,忘记了一个文件,或者它不是exe预期的位置。

如果你在Visual Studio中,请确保使用Ctr+F5(启动而不调试)而不是使用F5(启动调试)运行它。例如,有太多可能出错的事情,返回的每个错误代码都是相同的。main的返回值应该是表示某个内容的错误代码,如果返回值为0,则表示没有错误,所有错误都会得到“1”,因此您永远无法知道发生了哪些错误。我建议您也在每个循环或if语句中添加调试注释。。。祝你好运:)也许可以添加一些printfs来查看它的退出位置?可能使用
SDL\u GetError()