2011-12-12 13 views
6

Estoy jugando con OpenGL, uso SDL para manejar la ventana/entrada, etc. Actualmente estoy mostrando la información que deseo ver a un HUD. Bueno, esto se está volviendo demasiado engorroso, y me preguntaba si hay una manera simple de abrir una ventana de consola separada para informarme esta información. Todavía soy nuevo en C++ así que no me moleste si esto es obvio.Depuración de C++/SDL con la ventana de la consola

Respuesta

4

En el Enlazador -> Sistema en las propiedades de su proyecto, compruebe que el SubSistema sea "Consola (/ SUBSISTEMA: CONSOLA)". Eso hace que aparezca una ventana de consola separada cuando ejecuta su programa. Si su punto de entrada actual no es main, entonces tendrá que cambiarlo si lo hace.

+0

¿Cómo se aplica esto si, por ejemplo, codigo mi aplicación en un editor de texto y luego creo un ejecutable a través de Cmake? – Speldosa

+0

@Speldosa: debe encontrar la opción CMake que le permite pasar indicadores del enlazador, y luego pasar "/ SUBSYSTEM: CONSOLE" al enlazador. –

+0

set_target_properties (youapplication PROPERTIES LINK_FLAGS "/ SUBSYSTEM: CONSOLE") o hazlo: set (CMAKE_EXE_LINKER_FLAGS "/ SUBSYSTEM: CONSOLE") como configuración global. –

0

Si está ejecutando desde una línea de comandos y usa printf(), debería ver los mensajes desconectados en la ventana de su terminal. De lo contrario, podría iniciar sesión en un archivo y usar tail -f en cuadros de estilo * nix para ver el resultado tal como aparece.

¿Qué entorno estás usando? La mayoría de los IDE también mostrarán este resultado en sus ventanas de salida de depuración.

+0

¿Cómo realmente crearía esta ventana de consola? Actualmente estoy trabajando con una ventana generada por SDL. – grep

+0

¿En qué plataforma estás trabajando? Si se trata de Windows, simplemente ejecute cmd.exe y ejecute su programa desde allí, en una Mac use Terminal o en Linux cualquier terminal que elija. –

6

El siguiente código es para Windows. Siempre me parece muy útil para mantener en torno a la posibilidad de crear una ventana de consola en la demanda:

int hConHandle; 
    intptr_t lStdHandle; 
    CONSOLE_SCREEN_BUFFER_INFO coninfo; 
    FILE *fp; 

    // allocate a console for this app 
    AllocConsole(); 

    // set the screen buffer to be big enough to let us scroll text 
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); 
    coninfo.dwSize.Y = 500; 
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); 

    // redirect unbuffered STDOUT to the console 
    lStdHandle = (intptr_t)GetStdHandle(STD_OUTPUT_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "w"); 
    *stdout = *fp; 
    setvbuf(stdout, NULL, _IONBF, 0); 

    // redirect unbuffered STDIN to the console 
    lStdHandle = (intptr_t)GetStdHandle(STD_INPUT_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "r"); 
    *stdin = *fp; 
    setvbuf(stdin, NULL, _IONBF, 0); 

    // redirect unbuffered STDERR to the console 
    lStdHandle = (intptr_t)GetStdHandle(STD_ERROR_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "w"); 
    *stderr = *fp; 
    setvbuf(stderr, NULL, _IONBF, 0); 

    // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog point to console as well 
    std::ios::sync_with_stdio(); 

    //Keep our window in focus 
    SetForegroundWindow(m_hWnd);      // Slightly Higher Priority 
    SetFocus(m_hWnd);         // Sets Keyboard Focus To The Window 

Este código asume que la HWND está en una variable llamada m_hWnd; está copiado de un contenedor de clase que uso. Sin embargo, la forma de obtener el HWND de SDL depende de usted.

Para liberar la consola, llamar a esto:

FreeConsole(); 

AllocConsole y FreeConsole son funciones de la API de Win32.

Cuestiones relacionadas