创建窗口时发生SDL错误? #包括 #包括 #包括 bool init(字符*标题、整数宽度、整数高度); 无效关闭(); SDL_Window*Window=NULL; SDL_表面*屏幕=空; bool init(字符*标题、整型宽度、整型高度){ 布尔成功=真; //SDL_在成功时初始化0,在失败时返回负值 if(SDL_Init(SDL_Init_EVERYTHING)!=0){ SDL_日志(“无法初始化SDL:%s”,SDL_GetError()); 成功=错误; } //创建窗口和曲面 window=SDL_CreateWindow(显示标题、SDL_WINDOWPOS_未定义、SDL_WINDOWPOS_未定义、宽度、高度、SDL_window_); //SDL_CreateWindow在创建时返回窗口,在失败时返回NULL 如果(!窗口){ SDL_日志(“无法创建窗口:%s”,SDL_GetError()); 成功=错误; }否则{ //获取窗口表面 屏幕=SDL_GetWindowSurface(窗口); 如果(屏幕==NULL){ SDL_日志(“无法获取窗口表面:%s”,SDL_GetError()); 成功=错误; } } 回归成功; } 无效关闭(){ //释放面 SDL_自由曲面(屏幕); //破坏窗口 SDL_窗口(窗口); //SDL_退出(); SDL_退出(); } int main(){ bool running=true; SDL_事件; if(init(“我的窗口”,800600)){ printf(“祝贺您”); }否则{ printf(“对不起:(\n”); } (跑步时){ //start=SDL_GetTicks(); while(SDL_事件和事件)){ 开关(event.type){ 案例SDL_退出: 运行=错误; 打破 } SDL_更新内表面(窗口); } } close(); }

创建窗口时发生SDL错误? #包括 #包括 #包括 bool init(字符*标题、整数宽度、整数高度); 无效关闭(); SDL_Window*Window=NULL; SDL_表面*屏幕=空; bool init(字符*标题、整型宽度、整型高度){ 布尔成功=真; //SDL_在成功时初始化0,在失败时返回负值 if(SDL_Init(SDL_Init_EVERYTHING)!=0){ SDL_日志(“无法初始化SDL:%s”,SDL_GetError()); 成功=错误; } //创建窗口和曲面 window=SDL_CreateWindow(显示标题、SDL_WINDOWPOS_未定义、SDL_WINDOWPOS_未定义、宽度、高度、SDL_window_); //SDL_CreateWindow在创建时返回窗口,在失败时返回NULL 如果(!窗口){ SDL_日志(“无法创建窗口:%s”,SDL_GetError()); 成功=错误; }否则{ //获取窗口表面 屏幕=SDL_GetWindowSurface(窗口); 如果(屏幕==NULL){ SDL_日志(“无法获取窗口表面:%s”,SDL_GetError()); 成功=错误; } } 回归成功; } 无效关闭(){ //释放面 SDL_自由曲面(屏幕); //破坏窗口 SDL_窗口(窗口); //SDL_退出(); SDL_退出(); } int main(){ bool running=true; SDL_事件; if(init(“我的窗口”,800600)){ printf(“祝贺您”); }否则{ printf(“对不起:(\n”); } (跑步时){ //start=SDL_GetTicks(); while(SDL_事件和事件)){ 开关(event.type){ 案例SDL_退出: 运行=错误; 打破 } SDL_更新内表面(窗口); } } close(); },c,segmentation-fault,sdl,sdl-2,C,Segmentation Fault,Sdl,Sdl 2,我尝试创建一个单独的函数来初始化SDL窗口,然后尝试将surface附加到它,但它给出了分段错误(堆芯转储)。有时它也给出了错误Info:invalid Window 如果我不创建一个单独的函数并仅在主函数中运行此代码,它会工作!您忘记实现一个关键函数,它是: SDL_BlitSurface(SDL_曲面*,常数SDL_Rect*,SDL_曲面*,SDL_Rect*) 此功能可以blit曲面并将数据(图形信息)加载到SDL_曲面结构中 如果您想了解有关此功能的更多详细信息,可以查看链接 链接:为

我尝试创建一个单独的函数来初始化SDL窗口,然后尝试将surface附加到它,但它给出了
分段错误(堆芯转储)
。有时它也给出了错误
Info:invalid Window


如果我不创建一个单独的函数并仅在主函数中运行此代码,它会工作!

您忘记实现一个关键函数,它是:

SDL_BlitSurface(SDL_曲面*,常数SDL_Rect*,SDL_曲面*,SDL_Rect*)

此功能可以blit曲面并将数据(图形信息)加载到SDL_曲面结构中

如果您想了解有关此功能的更多详细信息,可以查看链接


链接:

为什么在
SDL\u GetWindowSurface()
提供给你的
SDL\u FreeSurface()
上调用
SDL\u FreeSurface()
呢?你是如何编译这段代码的,你有一些编译痕迹吗?@genpfault我做了,但有相同的错误。永远不要将你自己的函数定义为奇怪的
close
别名(这让事情变得更有趣,是一个弱符号)。或者至少让你的函数<代码>静态< /代码>。@ GNPFAUTAN是这个问题一次又一次地被问到,LLYYLE因为LaZyfo教程非常流行,并且命名他们的函数<代码>关闭< /代码>,但是使用C++(用Mangle),所以它不是问题。
#include<SDL2/SDL.h>
#include<stdio.h>
#include<stdbool.h>

bool init(char *title, int width, int height);
void close();

SDL_Window *window = NULL;
SDL_Surface *screen = NULL;

bool init(char *title, int width, int height){

    bool success = true;

// SDL_Init 0 on success and returns negative on failure
   if( SDL_Init(SDL_INIT_EVERYTHING) != 0 ){
       SDL_Log("Couldn't initialize SDL: %s",SDL_GetError());
       success = false;
   }

// creating Window and Surface
  window = SDL_CreateWindow(title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_SHOWN );


// SDL_CreateWindow returns window on creation and NULL on failure
    if ( !window ){
        SDL_Log("Couldn't create window: %s",SDL_GetError());
        success = false;
    } else {
        // get window surface
        screen = SDL_GetWindowSurface( window );
        if ( screen == NULL ){
            SDL_Log("Couldn't get window surface: %s",SDL_GetError());
            success = false;
        }
    }
    return success;
}

void close(){
    // deallocate surface
    SDL_FreeSurface( screen );
    // destroy window
    SDL_DestroyWindow( window );
    // SDL_Quit();
    SDL_Quit();
}

int main(){
    bool running  = true;
    SDL_Event event;
    if( init("My Window", 800, 600) ){
       printf("Congrats\n");
    } else {
        printf("Sorry :(\n");
    }

   while( running ) {
      //  start = SDL_GetTicks();
        while ( SDL_PollEvent( &event ) ){
            switch( event.type ){
                case SDL_QUIT:
                    running = false;
                    break;
            }
        SDL_UpdateWindowSurface( window );
        }
    }

    close();
}