2

私はGLFWを使用してアプリケーションを開発しています。これにより、ユーザーはコンソールに情報を入力し、プログラムはその情報を処理し、openglウィンドウを開いて(GLFWを使用して)結果を表示します。その後、ユーザーはウィンドウを閉じてメインメニューに戻り、必要に応じて詳細情報を入力できます。

現在私が抱えている問題は、GLFW / OpenGLウィンドウを閉じると、コンソールがscanf()からの入力を受け入れなくなることです。GLFWを適切に閉じていることはかなり確信しているので、問題が何であるかはわかりません。

私が使用しているコードは以下のとおりです。

Main.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;
}

pantograph.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

#glfw の人々のおかげで、私はややハックな解決策を見つけることができました...

glfw ウィンドウを閉じた直後に入力バッファを「フラッシュ」すると、scanf が再び機能し始めます。理由はよくわかりませんが、今のところうまくいっているようですので、満足しています。

私がそれを行うために使用しているコードは次のとおりです(ウィンドウを閉じた後):

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

この後、scanf は再び動作を開始しました。

于 2012-04-28T13:03:02.720 に答える
0

私はあなたのプログラムの流れに少し混乱しています。「ユーザーはウィンドウを閉じてメインメニューに戻ることができます」と言います。しかし、プログラムは (i<1000) ループからどのように抜け出すのでしょうか? ユーザーがウィンドウを閉じただけの場合、for ループがまだ実行されているように見えます (特にループ内の scanf のため)。

デバッガーを使用して、プログラムがキャッチされるポイントを確認しましたか?

于 2012-04-23T22:21:18.927 に答える