【发布时间】:2017-06-16 05:29:52
【问题描述】:
这只是假设向 SDL 窗口前端缓冲区显示 bmp 图像。我玩弄了代码。而且我认为我的 init() 函数有问题。我是 SDL 的新手。但是我的指针一定有问题,或者我对 SDL 的功能遗漏了一些东西 编辑:我使用了 GDB,结果发现我的 close() 函数是问题所在。我相信这是因为我正在释放设置为 NULL 的内存?我摆脱了关闭功能,并在延迟功能后释放了内存。
#include <SDL2/SDL.h>
#include <stdio.h>
#include <stdbool.h>
#define SCREENWIDTH 640
#define SCREENHEIGHT 480
SDL_Window *win = NULL;
SDL_Surface *scrn = NULL;
SDL_Surface *mscrn = NULL;
bool init()
{
bool suc = true;
char name[11] = "Hello SDL";
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
printf("%s", SDL_GetError());
suc = false;
}
win = SDL_CreateWindow(name, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREENWIDTH, SCREENHEIGHT, SDL_WINDOW_SHOWN);
if (win == NULL) {
printf("%s", SDL_GetError());
suc = false;
}
scrn = SDL_GetWindowSurface(win);
return suc;
}
bool loadmedia()
{
bool suc = true;
mscrn = SDL_LoadBMP("hello_world.bmp");
if (mscrn == NULL) {
printf("%s", SDL_GetError());
suc = false;
}
return suc;
}
void close()
{
SDL_FreeSurface(mscrn);
SDL_DestroyWindow(win);
SDL_Quit();
}
int main(int argc, char* args[])
{
if (!init()) {
close();
return 1;
}
if (!loadmedia()) {
close();
return 1;
}
SDL_BlitSurface(mscrn, NULL, scrn, NULL);
SDL_UpdateWindowSurface(win);
SDL_Delay(3000);
close();
return 0;
}
【问题讨论】:
-
你的编译器告诉你关于
close()的什么? -
close到底应该做什么? -
猜想:如果 SDL_Init 失败,您会发送消息(并且永远不会看到它,因为没有尾随换行符,因此没有隐式刷新),然后继续前进并尝试创建一个窗口。窗户表面也是如此。此时菜单上有一个调试器。
-
我的 close() 函数原来是问题所在。完成后我想释放 mscrn 并销毁一个窗口。我认为问题是如果 init() 为 false 那么 win 将设置为 NULL 并且 msrcn 仍将设置为 NULL 吗?但似乎我最大的问题是没有使用调试器
-
@ZhangBing
close是一个问题,只是因为它的名字。有一个具有该名称的标准 libc 函数,它关闭文件描述符,您的函数将覆盖它,但做的事情完全不同。在SDL_Init期间,SDL 可以使用文件描述符,例如连接到 X11 服务器(通过网络套接字),查询一些信息,并在该描述符上调用close,然后调用您的close- 但此时尚未创建窗口和渲染器。不要覆盖系统功能。重命名或标记为static。你也不应该释放窗口表面。