Отладка C ++ / SDL с помощью окна консоли - PullRequest
6 голосов
/ 13 декабря 2011

Я играю с некоторым OpenGL, использую SDL для обработки окна / ввода и т. Д. В настоящее время я отображаю любую информацию, которую я хочу видеть в HUD. Ну, это становится слишком громоздким, и мне было интересно, есть ли простой способ открыть отдельное окно консоли, чтобы сообщить мне эту информацию. Я все еще новичок в C ++, поэтому будьте спокойны, если это очевидно.

Ответы [ 3 ]

6 голосов
/ 13 декабря 2011

Следующий код для Windows.Мне всегда удобно иметь возможность создавать консольное окно по требованию:

    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

Этот код предполагает, что HWND находится в переменной с именем m_hWnd;это скопировано из обертки класса, которую я использую.Однако, как вы получаете HWND из SDL, зависит только от вас.

Чтобы освободить консоль, вызовите это:

FreeConsole();

AllocConsole и FreeConsole - функции Win32 API.

4 голосов
/ 13 декабря 2011

В Linker -> System в свойствах вашего проекта проверьте, что подсистема является "Консоль (/ SUBSYSTEM: CONSOLE)".Это приводит к тому, что при запуске вашей программы открывается отдельное окно консоли.Если ваша текущая точка входа не main, то вам нужно изменить ее на это, если вы сделаете это, хотя.

0 голосов
/ 13 декабря 2011

Если вы работаете из командной строки и используете printf(), вы должны увидеть сообщения, вышедшие из окна вашего терминала.В противном случае вы можете войти в файл и использовать поля tail -f on * nix для просмотра результатов в том виде, в котором они отображаются.

Какую среду вы используете?Большинство IDE также отображают этот вывод в своих окнах вывода отладки.

...