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
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.
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.
Come posso creare questa finestra della console? Attualmente sto lavorando con una finestra generata da SDL. – grep
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. –
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.
Come si applica questo se, ad esempio, codifico la mia applicazione in un editor di testo e poi creo un eseguibile tramite Cmake? – Speldosa
@Speldosa: è necessario trovare l'opzione CMake che consente di passare i flag del linker e quindi passare "/ SUBSYSTEM: CONSOLE" al linker. –
set_target_properties (youapplication PROPERTIES LINK_FLAGS "/ SUBSYSTEM: CONSOLE") o do: set (CMAKE_EXE_LINKER_FLAGS "/ SUBSYSTEM: CONSOLE") come impostazione globale. –