2

我正在使用 GLFW 开发一个应用程序,用户可以在控制台中输入一些信息,程序对信息进行一些处理,然后打开一个 opengl 窗口(使用 GLFW)来显示结果。然后用户可以关闭窗口,并返回到主菜单并输入更多信息(如果他们愿意)。

目前我遇到的问题是,一旦关闭 GLFW/OpenGL 窗口,控制台就不再接受来自 scanf() 的任何输入。我相当肯定我正在正确关闭 GLFW,所以我不确定问题是什么。

我正在使用的代码如下:

主要.c:

#include <stdio.h>
#include <stdlib.h>
#include "glfw.h"
#include "pantograph.h"
int main(int argc, char** argv)
{
    printf("program start");
    int a = 0;
    scanf("%i",&a); //this works
    printf("%c",a);
    p_open_window(1000, 500, 0, "hi there");
    int i = 0;
    for(i=0;i<1000;i++)
    {
        p_begin_render();
        glBegin(GL_POINTS);
            glVertex2i(i,i/2);
        glEnd();
        scanf("%i",&a);
        p_end_render();
    }
    p_close_window();
    scanf("%i",&a); //this does not work
    printf("%i",a);
    return 0;
}

受电弓.h:

int p_open_window(int width, int height, int fullscreen, const char* title)
{
    glfwInit();
    glfwDisable(GLFW_AUTO_POLL_EVENTS);
    if(fullscreen)
    {
        glfwOpenWindow(width,height,8,8,8,8,0,0,GLFW_FULLSCREEN);
    }else{
        glfwOpenWindowHint(GLFW_WINDOW_NO_RESIZE, GL_TRUE);
        glfwOpenWindow(width,height,8,8,8,8,0,0,GLFW_WINDOW);       
    }

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, width, height, 0, 0, 1);
    glMatrixMode(GL_MODELVIEW);
    glDisable(GL_DEPTH_TEST);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    return 1;
}
void p_begin_render()
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor4f(1.0, 1.0, 1.0, 1.0);
    glLoadIdentity();
}
void p_end_render()
{
    glfwSwapBuffers();
}
void p_close_window()
{
    glfwCloseWindow();
    glfwTerminate();
}
4

2 回答 2

0

我对你的程序流程有点困惑。您说“用户可以关闭窗口并返回主菜单”。但是程序如何退出 (i<1000) 循环呢?如果用户只是关闭窗口,它似乎仍在执行 for 循环(特别是因为循环内的 scanf )。

您是否使用调试器来查看您的程序在哪一点被捕获?

于 2012-04-23T22:21:18.927 回答
0

感谢#glfw 的人们,我设法找到了一个有点骇人听闻的解决方案......

如果在关闭 glfw 窗口后直接“刷新”输入缓冲区,scanf 将再次开始工作。我不完全确定为什么,但它现在似乎有效,所以我很满意。

我用来做的代码如下(关闭窗口后):

int ch;
while ((ch = getchar()) != '\n' && ch != EOF);

在此之后,scanf 再次开始工作。

于 2012-04-28T13:03:02.720 回答