2011-12-12 17 views
6

Sto giocando con alcuni OpenGL, utilizzando SDL per gestire la finestra/input ecc. Attualmente sto visualizzando tutte le informazioni che voglio vedere su un HUD. Bene, questo è troppo complicato, e mi chiedevo se c'è un modo semplice per aprire una finestra della console separata per segnalare queste informazioni a me. Sono ancora nuovo al C++, quindi agisci con me se questo è ovvio.C++/SDL Debugging con la finestra della console

risposta

4

In Linker -> Sistema nelle proprietà del progetto, verificare che il sottosistema sia "Console (/ SUBSYSTEM: CONSOLE)". Ciò fa sì che venga visualizzata una finestra della console separata quando si esegue il programma. Se il tuo attuale punto di ingresso non è main, allora dovrai cambiarlo se lo fai comunque.

+0

Come si applica questo se, ad esempio, codifico la mia applicazione in un editor di testo e poi creo un eseguibile tramite Cmake? – Speldosa

+0

@Speldosa: è necessario trovare l'opzione CMake che consente di passare i flag del linker e quindi passare "/ SUBSYSTEM: CONSOLE" al linker. –

+0

set_target_properties (youapplication PROPERTIES LINK_FLAGS "/ SUBSYSTEM: CONSOLE") o do: set (CMAKE_EXE_LINKER_FLAGS "/ SUBSYSTEM: CONSOLE") come impostazione globale. –

0

Se si sta eseguendo da una riga di comando e si utilizza printf(), i messaggi dovrebbero essere registrati nella finestra del terminale. In caso contrario, è possibile accedere a un file e utilizzare tail -f in caselle di stile * nix per visualizzare l'output così come appare.

Che ambiente stai usando? La maggior parte degli IDE mostrerà questo output anche nelle loro finestre di output di debug.

+0

Come posso creare questa finestra della console? Attualmente sto lavorando con una finestra generata da SDL. – grep

+0

Su quale piattaforma stai lavorando? Se è Windows, esegui cmd.exe ed esegui il programma da lì, su un Mac usa Terminale o su qualsiasi terminale di tua scelta. –

6

Il seguente codice è per Windows. Trovo sempre a portata di mano per mantenere intorno alla possibilità di creare una finestra di console su richiesta:

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 

Questo codice presuppone che il HWND è in una variabile chiamata m_hWnd; è copiato da un wrapper di classe che uso. Spetta a te, tuttavia, come ottenere HWND da SDL.

per liberare la console, chiamare questo:

FreeConsole(); 

AllocConsole e FreeConsole sono funzioni API Win32.

Problemi correlati