我对编程很新,所以这个问题可能是基本的。我正在使用SDL2库(在Visual Studio 2013中)用C ++编写一个非常基本的程序。当我写作时,我遇到了一个问题。我写了以下内容:
int controles(){
//declare actions that will happen when a key is pressed
const Uint8 * estado = SDL_GetKeyboardState(NULL);
if (estado[SDL_SCANCODE_UP]){ y--; SDL_UpdateWindowSurface(ventana); }
if (estado[SDL_SCANCODE_DOWN]){ y++; SDL_UpdateWindowSurface(ventana); }
return 0;
}
问题是我需要在修改 y 的值后更新窗口表面,但是我收到错误,因为 ventana ,窗口的名称,在另一个函数中定义。我尝试在全球范围内定义 ventana ,但该程序当时不会起作用。然后我想到了以下几点;在 graficos 中编写一个 goto 语句,这是定义 ventana 的函数,以便跳过该函数中的所有其他语句,除了一个更新窗口表面。但是,当我这样做时,程序甚至无法编译:
int graficos(int caso){
if (caso == 1) {goto reload;} //skip to reload if (1)
SDL_Init(SDL_INIT_VIDEO); //load SDL
//load graphics in memory
SDL_Window * ventana = SDL_CreateWindow("ventana", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0);
SDL_Surface * superficie = SDL_GetWindowSurface(ventana);
SDL_Surface * pantallainicio = SDL_LoadBMP("pantallainicio.bmp");
SDL_Surface * paleta = SDL_LoadBMP("paleta.bmp");
SDL_Rect rpantallainicio = { 0, 0, 640, 480 };
SDL_Rect rpaleta = { x, y, 16, 16 };
//render graphics
SDL_BlitSurface(pantallainicio, NULL, superficie, &rpantallainicio);
SDL_BlitSurface(paleta, NULL, superficie, &rpaleta);
SDL_UpdateWindowSurface(ventana);
reload:SDL_UpdateWindowSurface(ventana);
return 0;
}
我收到以下错误:
error C4533: initialization of 'rpaleta' is skipped by 'goto reload'
error C4533: initialization of 'rpantallainicio' is skipped by 'goto reload'
我希望我能很好地解释我的问题。我能做什么?有没有办法来解决这个问题?或者我可以用其他方式引用 ventana 吗?这个问题可能非常基础,对不起,并提前感谢!
答案 0 :(得分:0)
你可以通过根本不使用goto来解决这个问题 - 改为使用子功能。此外,提取变量ventana,因为您需要它随时由graficos存储和使用。
void init()
{
SDL_Init(SDL_INIT_VIDEO); //load SDL
//load graphics in memory
ventana = SDL_CreateWindow("ventana", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0);
SDL_Surface * superficie = SDL_GetWindowSurface(ventana);
SDL_Surface * pantallainicio = SDL_LoadBMP("pantallainicio.bmp");
SDL_Surface * paleta = SDL_LoadBMP("paleta.bmp");
SDL_Rect rpantallainicio = { 0, 0, 640, 480 };
SDL_Rect rpaleta = { x, y, 16, 16 };
//render graphics
SDL_BlitSurface(pantallainicio, NULL, superficie, &rpantallainicio);
SDL_BlitSurface(paleta, NULL, superficie, &rpaleta);
}
int graficos(int caso)
{
if (caso != 1) { init(); } //skip to reload if (1)
SDL_UpdateWindowSurface(ventana);
return 0;
}
SDL_Window * ventana;
goto的使用通常应该 。尽可能使用子程序或其他替代方案。在这里,代码与最初的预期完全相同,但是" extra"当caso不是1时发生的流被包装在它自己的名为' init'的子程序中。