用SDL_Init和IMG_Init初始化SDL后,我观察errno上的代码11。这意味着资源暂时不可用。但我不知道为什么。请帮我解决这个问题。在初始化前后,我观察到errno的值。
#include <stdio.h>
#include <stdlib.h>
#include "../includes/init.h"
#include "../includes/map.h"
#include "../includes/startGame.h"
#include <errno.h>
int main(int argc, char const *argv[]){
int game = 1;
SDL_Window* screen = NULL;
SDL_Renderer *screen_render = NULL;
SDL_Event e;
initAllScreenAndRenderer(&screen, &screen_render);
while (game){
while (SDL_PollEvent(&e)){
switch (e.type){
case SDL_QUIT:
game=0;
break;
case SDL_KEYDOWN:
switch (e.key.keysym.sym){
case SDLK_a:
play(&screen_render);
break;
}
break;
}
}
SDL_RenderClear(screen_render);
SDL_RenderPresent(screen_render);
}
destroyAllScreenAndRenderer(&screen, &screen_render);
}
void initAllScreenAndRenderer(SDL_Window **window, SDL_Renderer **window_renderer){
printf("n%dn", errno);
if (SDL_Init(SDL_INIT_VIDEO) == -1 || IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG){
printf("nError of initialisation : %sn", SDL_GetError());
exit(-1);
}
printf("n%dn", errno);
*window = SDL_CreateWindow(GAME_NAME, SDL_WINDOWPOS_UNDEFINED, `SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGTH, SDL_WINDOW_SHOWN);`
if (*window==NULL){
printf("nError of initialisation window : %sn", SDL_GetError());
exit(-1);
}
printf("n%dn", errno);
*window_renderer = SDL_CreateRenderer(*window, -1, SDL_RENDERER_ACCELERATED);
if (*window_renderer==NULL){
printf("nError of initialisation renderer : %sn", SDL_GetError());
exit(-1);
}
printf("n%dn", errno);
}
如果函数没有报告错误,则不应检查errno
。函数可以设置errno
(通常作为副作用(,即使它成功了。
以前的情况是这样的(可能现在仍然是,但我已经好几年没有检查了(,Solaris上的许多标准I/O函数在输出不到终端时会将errno
设置为ENOTTY
,即使该函数成功了。这是完全合法的。
参见C标准§7.4错误<errno.h>
§3,其中写道:
程序启动时,初始线程中
errno
的值为零(其他线程中errno
的初始值不确定(,但任何库函数都不会将其设置为零202(errno
的值可以通过库函数调用设置为非零,无论是否存在错误,前提是errno
的使用没有记录在本国际标准中的函数描述中。202(因此,使用
errno
进行错误检查的程序应在库函数调用之前将其设置为零,然后在随后的库函数调用前对其进行检查。当然,库函数可以在条目中保存errno
的值,然后将其设置为零,只要在返回之前errno
的值仍然为零,就可以恢复原始值。
TL;DR——除非函数报告故障,并且记录了在故障时将errno
设置为有意义的值,否则不要检查errno
。