尝试轮询事件时出现 SDL2 分段错误
SDL2 Segmentation fault when trying to Poll Event
我想创建一个小程序,它应该绘制一些数学函数。
起初我只是写了代码,它应该创建一个小 Window,它应该是可见的,直到我在 window 处点击 X。
#include <iostream>
#include <SDL2/SDL.h>
SDL_Window* window;
SDL_Renderer* renderer;
bool running = true;
bool init() {
if(SDL_Init(SDL_INIT_EVERYTHING) < 0) return false;
window = SDL_CreateWindow("Visual Functions", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 100, 200, SDL_WINDOW_SHOWN);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if(window == NULL) return false;
if(renderer == NULL) return false;
std::cout << "App and SDL init success" << std::endl;
return true;
}
void onEvent(SDL_Event* event) {
switch (event->type)
{
case SDL_QUIT:
running = false;
break;
default:
break;
}
}
void loop() {
SDL_Event* event;
while(SDL_PollEvent(event)) onEvent(event);
}
void cleanUp() {
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
}
int main(int, char**) {
if(!init()) {
std::cout << "SDL or/and App init failed" << std::endl;
exit(-1);
}
while(running) loop();
cleanUp();
}
但是 window 上下弹出的速度如此之快,以至于我什至看不到它,在命令中首先是 App and SDL init success
,然后是 Segmentation fault
。
在另一个代码中,具有相同的初始化和循环代码运行得很好并且一切都正常显示(至少对于 SDL 部分)。
我发现一些调试消息,循环没有到达事件函数,也没有到达循环函数的末尾,所以问题是 SDL_PollEvent(event)
,但问题是什么以及如何解决它?
您永远不会创建您正在使用的 SDL_Event 结构:
void loop() {
SDL_Event* event;
while(SDL_PollEvent(event)) onEvent(event);
}
应该是这个
void loop() {
SDL_Event event;
while(SDL_PollEvent(&event)) onEvent(&event);
}
我想创建一个小程序,它应该绘制一些数学函数。
起初我只是写了代码,它应该创建一个小 Window,它应该是可见的,直到我在 window 处点击 X。
#include <iostream>
#include <SDL2/SDL.h>
SDL_Window* window;
SDL_Renderer* renderer;
bool running = true;
bool init() {
if(SDL_Init(SDL_INIT_EVERYTHING) < 0) return false;
window = SDL_CreateWindow("Visual Functions", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 100, 200, SDL_WINDOW_SHOWN);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if(window == NULL) return false;
if(renderer == NULL) return false;
std::cout << "App and SDL init success" << std::endl;
return true;
}
void onEvent(SDL_Event* event) {
switch (event->type)
{
case SDL_QUIT:
running = false;
break;
default:
break;
}
}
void loop() {
SDL_Event* event;
while(SDL_PollEvent(event)) onEvent(event);
}
void cleanUp() {
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
}
int main(int, char**) {
if(!init()) {
std::cout << "SDL or/and App init failed" << std::endl;
exit(-1);
}
while(running) loop();
cleanUp();
}
但是 window 上下弹出的速度如此之快,以至于我什至看不到它,在命令中首先是 App and SDL init success
,然后是 Segmentation fault
。
在另一个代码中,具有相同的初始化和循环代码运行得很好并且一切都正常显示(至少对于 SDL 部分)。
我发现一些调试消息,循环没有到达事件函数,也没有到达循环函数的末尾,所以问题是 SDL_PollEvent(event)
,但问题是什么以及如何解决它?
您永远不会创建您正在使用的 SDL_Event 结构:
void loop() {
SDL_Event* event;
while(SDL_PollEvent(event)) onEvent(event);
}
应该是这个
void loop() {
SDL_Event event;
while(SDL_PollEvent(&event)) onEvent(&event);
}