我正在使用Dev-C ++ 4.9.9.2(不要问为什么)和SDL 1.2.8。
接下来我创建了新项目:SDL& GL。该项目已包含一些代码:
#include <SDL/SDL.h>
#include <gl/gl.h>
int main(int argc, char *argv[]){
SDL_Event event;
float theta = 0.0f;
SDL_Init(SDL_INIT_VIDEO);
SDL_SetVideoMode(600, 300, 0, SDL_OPENGL | SDL_HWSURFACE | SDL_NOFRAME);
glViewport(0, 0, 600, 300);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_PROJECTION);
glMatrixMode(GL_MODELVIEW);
int done;
for(done = 0; !done;){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f,0.0f,0.0f);
glRotatef(theta, 0.0f, 0.0f, 1.0f);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2f(0.0f, 1.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex2f(0.87f, -0.5f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex2f(-0.87f, -0.5f);
glEnd();
theta += .5f;
SDL_GL_SwapBuffers();
SDL_PollEvent(&event);
if(event.key.keysym.sym == SDLK_ESCAPE)
done = 1;
}
SDL_Quit();
return(0);
}
接下来我编译了项目并尝试运行它。运行后,程序显示不到1秒钟,并立即终止。调试器返回以下错误:“程序中出现访问冲突(分段错误)”。
我正在使用Windows 2003和Radeon x1950 PRO以及最新的驱动程序。
我已经在Windows XP的笔记本电脑上测试了程序,它运行得很好。为什么这个程序在我的电脑上不起作用?
答案 0 :(得分:2)
它也适合我。我尝试删除SDL_HWSURFACE并从窗口调用中添加SDL_DOUBLEBUF。
SDL_SetVideoMode(600, 300, 0, SDL_OPENGL | SDL_NOFRAME | SDL_DOUBLEBUF);
while(!done)看起来更漂亮,更容易阅读。既然它用C ++标记,为什么你不使用bool?
bool done = false;
while(!done){
您还需要while(SDL_PollEvent(&amp; event)),因为每帧可能有多个事件。
while(SDL_PollEvent(&event))
{
switch(event.type)
case SDL_KEYDOWN:
if(event.key.keysym.sym == SDLK_ESCAPE)
done = true;
}
答案 1 :(得分:0)
我的猜测是它在SDL_PollEvent()上崩溃了。如果有事件,则返回1 / true,否则返回0 / false。当它返回true时,它将是基于event.type的某种类型的SDL_Event。 SDL_Event是所有SDL事件的并集,并且不保证一个事件中的某些信息与另一个事件的顺序,类型等相同。因此,您只需要检查事件的类型并根据需要进行处理。当然,请查看docs了解更多信息。像这样:
if (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_KEYUP:
if (event.key.keysym.sym == SDLK_ESCAPE)
done = 1;
}
}
答案 2 :(得分:0)
我终于找到了一些时间来解决这个问题。我已完全卸载旧卡图形驱动程序并使用Catalyst Control Center安装9.8 ATI驱动程序。现在一切正常。
代码本身没有问题。问题出在我的系统中,带有图形驱动程序。无论如何,谢谢你的回答!