Textausgabe in eine Console trotz Fensteranwendung?
-
Erstmal hallo an alle die mein Thema lesen.
Ich habe folgendes Problem.
Ich schreibe gerade im Rahmen meines Studiums eine Anwendung, welche das Fahrverhalten ein Fahrzeug simmulieren und grafisch ausgeben soll. Das reagieren des Fahrzeuges auf seine umgebung soll dann durch eine fuzzy gesteuerte KIerfolgen.
Angefangen habe ich damit , das ich das Fahrzeug, Die Simulation und die KI in einer Win32 Konsolenanwendung zu entwickeln
Jetzt bin ich an einem Punkt angelangt wo ich anfange mir Gedanken über die grafische Simulation des ganzen zu machen.
Da ich schon ein paar Erfahrungen aus anderen Projekten mit directX gesammelt habe wird es hierbei wohl auf eine grafische 2D Darstellung hinauslaufen mittels DirectX.Um dafür das Grundgerüst zu legen habe ich mir erstmal ein Fenster erzeugt.
Und nun mein Problem.
Da die Simulation nun über ein Windowsfenster läuft habe ich natürlich keine
Konsole mehr. In dem bisherigen Programm sind aus debuggründen
jede menge cout<< bzw printf() funktionen vorhanden, die ich nun mangels einer Konsole nicht mehr zu gesicht bekomme :-(.Kann mir jemand einen Tipp geben wie ich diese Ausgaben in das Debugfenster
von Visual Studio 6 umleiten kann oder wie ich sie mittels in einer Console oder sonst irgend wie wieder sichtbar bekomme?Schonmal Danke für jeden Tip.
Mein bisheriges erzeugen des Fensters:
//=================================================================== // MAIN //=================================================================== /* ** KIT_windowhandler */ LRESULT CALLBACK KIT_windowhandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_COMMAND: switch( LOWORD( wParam)) { case IDM_EXIT: PostMessage( hWnd, WM_CLOSE, 0, 0); return 0; } break; case WM_GETMINMAXINFO: ((MINMAXINFO *)lParam)->ptMinTrackSize.x = ((MINMAXINFO *)lParam)->ptMaxTrackSize.x = KIT_bruttobreite; ((MINMAXINFO *)lParam)->ptMinTrackSize.y = ((MINMAXINFO *)lParam)->ptMaxTrackSize.y = KIT_bruttohoehe; return 0; case WM_DESTROY: PostQuitMessage( 0); return 0; } return DefWindowProc(hWnd, msg, wParam, lParam); } /* ** WinMain */ int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow) { MSG msg; HACCEL acc; WNDCLASSEX wcx; KIT_instance = hInst; wcx.cbSize = sizeof( wcx); wcx.lpszClassName = TEXT( "KIT"); wcx.lpfnWndProc = KIT_windowhandler; wcx.style = CS_VREDRAW | CS_HREDRAW; wcx.hInstance = hInst; wcx.hIcon = LoadIcon( hInst, MAKEINTRESOURCE( IDI_MAIN)); wcx.hIconSm = LoadIcon( hInst, MAKEINTRESOURCE( IDI_MAIN)); wcx.hCursor = LoadCursor( NULL, IDC_ARROW); wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcx.lpszMenuName = MAKEINTRESOURCE( IDR_MENU); wcx.cbClsExtra = 0; wcx.cbWndExtra = 0; if( !RegisterClassEx( &wcx)) return 0; acc = LoadAccelerators( hInst, MAKEINTRESOURCE(IDR_ACCEL)); KIT_bruttohoehe = KIT_nettohoehe + 2*GetSystemMetrics( SM_CYSIZEFRAME) + GetSystemMetrics( SM_CYMENU) + GetSystemMetrics( SM_CYCAPTION); KIT_bruttobreite = KIT_nettobreite + 2*GetSystemMetrics( SM_CXSIZEFRAME); KIT_window = CreateWindowEx( 0, TEXT( "KIT"), TEXT( "KIT"), WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, KIT_bruttobreite, KIT_bruttohoehe, NULL, NULL, hInst, NULL); if( !KIT_window) return 0; KIT_menu = GetMenu( KIT_window); MoveWindow( KIT_window, (GetSystemMetrics(SM_CXSCREEN)-KIT_bruttobreite)/2, (GetSystemMetrics(SM_CYSCREEN)-KIT_bruttohoehe)/2, KIT_bruttobreite, KIT_bruttohoehe, TRUE); ShowWindow( KIT_window, nCmdShow); while( TRUE) { if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE)) { if( GetMessage( &msg, NULL, 0, 0 ) == 0) return 0; // Message ist WM_QUIT if( TranslateAccelerator( KIT_window, acc, &msg) == 0) { TranslateMessage( &msg); DispatchMessage( &msg); } } else { // Um die Simulation kuemmern // vorläufig erstmal if (test == false) { BeschattenSim Sim; Sim.Simulation(); //Sim.ReglerTest(); printf("ENDE\n"); test = true; } } } }
-
//mit suchen/ersetzen einfach TRACE anstatt printf einfügen TRACE("Wie printf %d",123);
-
Hallo erstmal Danke für deine Antwort.
Das war auch das erste was ich probiert habe. Leider kann ich nur den
TRACE befehl nicht nutzen (fehlermeldung beim compilieren), liegt sicher daran, dass ich die Fenster aplikation nicht über eine MFC Anwendung erstellt habe, nehme ich jedenfalls an.Kennt irgendwer eine andere Möglichkeit mit der man den Stream wieder sichtbar bekommt
-
Zeig doch bitte mal die Fehlermeldung.
-
Die Fehlermeldung lautet:
--------------------Konfiguration: Demo - Win32 Debug--------------------
Kompilierung läuft...
Demo.cpp
c:\studium\kit\programming\beschattensim kraftsys v1_2\demo.cpp(1191) : error C2065: 'TRACE' : nichtdeklarierter Bezeichner
Fehler beim Ausführen von cl.exe.Demo.obj - 1 Fehler, 0 Warnung(en)
Wie gesagt liegt sicherlich daran, das ich das Fenster selbst geschrieben habe
(siehe oben) und nicht die MFC genutzt habe fehlt also noch irgendwas für
trace weiß nur leider nicht was.
Denn wenn ich ein leeres Projekt mit der MFC starte kann ich TRACE natürlich im Debugfenster nutzen
Möchte aber nur äußerst ungern auf die MFC umschwenken, weil ich da zu schnell
die Übersicht verliere ....
und das Projekt eigendlich klein genug ist, das es auch ohne MFC gehen sollte.Trace in meinem Program
.... ShowWindow( KIT_window, nCmdShow); while( TRUE) { if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE)) { if( GetMessage( &msg, NULL, 0, 0 ) == 0) return 0; // Message ist WM_QUIT if( TranslateAccelerator( KIT_window, acc, &msg) == 0) { TranslateMessage( &msg); DispatchMessage( &msg); } } else { // Um die Simulation kuemmern // vorläufig erstmal if (Sim.Sim_laeuft == true) { Sim.Simulation(); TRACE("ENDE\n"); } } }
-
Naja, da gibts wohl zwei Möglichkeiten:
1. Du bindest die MFC an, nutzt aber nix außer TRACE.
2. Du fragst nochmal im Win-API Forum. Hier sind die meisten wohl so eingeschossen auf die MFC, dass sie Alternativen nicht kennen (so wie ich).Hmm, ich hab noch ne Idee: Schreib das doch in eine Textdatei. Dann kannst du die hinterher angucken.
-
Hi Nochmal
Das mit dem Anbinden habe ich schon probiert... bin aber gescheitert, weil ich nicht genau weiß was dafür von nöten ist.
Die Ausgabe in eine Textdatei läuft permanent nebenbei für spätere Auswertungen etwa mit Gnuplot, Exel etc.Der Vorteil an der direken Ausgabe lag darin , das ich zur Laufzeit der Simulation erkennen konnte, ob die Werte aus dem Ruder laufen um die Sim dann per Hand vorzeitig zu beenden :-).
Danke für den Tip bezüglich Win-API Forum werd das wohl auch noch mal probieren