Problem mit NeHBe Basecoede



  • Hallo,

    ich habe ein Problem mit dem code von NeHe zum Erzeugen eines Fensters.
    (Von der Seite http://nehe.gamedev.net/ links unter der Rubrik OpenGL Basecode. Unterpunkt NeHeGL Latest)

    Und zwar in diesem Codeabschnitt:

    // Process Window Message Callbacks
    LRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	// Get The Window Context
    	GL_Window* window = ((GL_Window*)(GetWindowLongPtr (hWnd, GWL_USERDATA)));
    
    	switch (uMsg)														// Evaluate Window Message
    	{
    		case WM_SYSCOMMAND:												// Intercept System Commands
    		{
    			switch (wParam)												// Check System Calls
    			{
    				case SC_SCREENSAVE:										// Screensaver Trying To Start?
    				case SC_MONITORPOWER:									// Monitor Trying To Enter Powersave?
    				return 0;												// Prevent From Happening
    			}
    			break;														// Exit
    		}
    		return 0;														// Return
    
    		case WM_CREATE:													// Window Creation
    		{
    			CREATESTRUCT* creation = (CREATESTRUCT*)(lParam);			// Store Window Structure Pointer
    			window = (GL_Window*)(creation->lpCreateParams);
    			SetWindowLong (hWnd, GWL_USERDATA, (LONG)(window));
    		}
    		return 0;														// Return
    
    		case WM_CLOSE:													// Closing The Window
    			TerminateApplication(window);								// Terminate The Application
    		return 0;														// Return
    
    		case WM_SIZE:													// Size Action Has Taken Place
    			switch (wParam)												// Evaluate Size Action
    			{
    				case SIZE_MINIMIZED:									// Was Window Minimized?
    					window->isVisible = FALSE;							// Set isVisible To False
    				return 0;												// Return
    
    				case SIZE_MAXIMIZED:									// Was Window Maximized?
    					window->isVisible = TRUE;							// Set isVisible To True
    					ReshapeGL (LOWORD (lParam), HIWORD (lParam));		// Reshape Window - LoWord=Width, HiWord=Height
    				return 0;												// Return
    
    				case SIZE_RESTORED:										// Was Window Restored?
    					window->isVisible = TRUE;							// Set isVisible To True
    					ReshapeGL (LOWORD (lParam), HIWORD (lParam));		// Reshape Window - LoWord=Width, HiWord=Height
    				return 0;												// Return
    			}
    		break;															// Break
    
    		case WM_KEYDOWN:												// Update Keyboard Buffers For Keys Pressed
    			if ((wParam >= 0) && (wParam <= 255))						// Is Key (wParam) In A Valid Range?
    			{
    				window->keys->keyDown [wParam] = TRUE;					// Set The Selected Key (wParam) To True
    				return 0;												// Return
    			}
    		break;															// Break
    
    		case WM_KEYUP:													// Update Keyboard Buffers For Keys Released
    			if ((wParam >= 0) && (wParam <= 255))						// Is Key (wParam) In A Valid Range?
    			{
    				window->keys->keyDown [wParam] = FALSE;					// Set The Selected Key (wParam) To False
    				return 0;												// Return
    			}
    		break;															// Break
    
    		case WM_TOGGLEFULLSCREEN:										// Toggle FullScreen Mode On/Off
    			g_createFullScreen = (g_createFullScreen == TRUE) ? FALSE : TRUE;
    			PostMessage (hWnd, WM_QUIT, 0, 0);
    		break;															// Break
    	}
    
    	return DefWindowProc (hWnd, uMsg, wParam, lParam);					// Pass Unhandled Messages To DefWindowProc
    }
    

    Das Problem ist bei

    GL_Window* window = ((GL_Window*)(GetWindowLongPtr (hWnd, GWL_USERDATA)));
    

    erhalte ich die Warnung

    warning C4312: 'Typumwandlung': Konvertierung von 'LONG' in größeren Typ 'GL_Window *'

    Und bei

    SetWindowLong (hWnd, GWL_USERDATA, (LONG)(window));
    

    erhalte ich die Warnung:

    warning C4311: 'Typumwandlung': Zeigerverkürzung von 'GL_Window *' zu 'LONG'

    Jetzt habe ich versucht einfach folgendes zu verwenden:

    long window = ((GL_Window*)(GetWindowLongPtr (hWnd, GWL_USERDATA)));
    

    Aber dann funktioniert folgendes überhaupt nicht mehr:

    window = (GL_Window*)(creation->lpCreateParams);
    

    Es funktioniert mit den Warnungen, aber es ist ja nicht sooo sinnvoll etwas zu verwenden was eine Warnung erzeugt.
    Wie bekomme ich es also hin, dass es ohne Warnungen funktioniert?



  • Was für Warnungen kommen denn?



  • Kann dir bei deinem speziellen Problem zwar nicht helfen,
    aber oft sind Warnungen normal und werden mit Befehlen
    einfach disabled(nicht nur bei älterem code, teilweise auch bei neuerem). Und wenn
    es Funktioniert, und du keine Nachteile durch die Warnung erfährst, einfach
    ignorieren.

    Der Code von nehe ist auch schon etwas älter, könnte mit ein Grund für
    die Fehlermeldungen sein.



  • naja normalerweise sollte man auf keinen fall warnings ignorieren, meistens weisen sie auf sehr nützliche und potenziell gefährliche schwachstellen im code hin die später fehler verursachen könnten auf die man absolut nicht draufkommt weil

    eventuell läuft für lange zeit alles richtig und nur unter bestimmten voraussetzungen oder wenn man etwas im code verändert treten fehler auf

    allerdings, ich weiss ja nicht mit welchem compiler du das kompilierst aber wenn ich es mit 3/4 warning stufe (default) laufen renne kommen keine warnings

    auf warning stufe 4/4 kommen 5 warnings allerdings nicht die 2 die du hast sondern für

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    

    warning C4100: 'nCmdShow' : unreferenced formal parameter
    warning C4100: 'lpCmdLine' : unreferenced formal parameter
    warning C4100: 'hPrevInstance' : unreferenced formal parameter

    switch (uMsg)														// Evaluate Window Message
    	{
    		case WM_SYSCOMMAND:												// Intercept System Commands
    		{
    			switch (wParam)											...
    			break;														// Exit
    		}
    		return 0;	//<------warning C4702
    

    warning C4702: unreachable code

    und für

    window->init.bitsPerPixel, // Select Our Color Depth

    warning C4244: 'initializing' : conversion from 'int' to 'BYTE', possible loss of data

    du siehst also es ist compiler abhängig, lass deine warning stufe ruhig oben, es ist gut dass du sie beachtest, aber man sollte auch wissen welche warnings wichtig sind und welche vernachlässigbar

    beispielsweise schreibe ich einfach aus gewohnheit für jedes case in einem switch immer ein break, selbst wenn vorher ein return kommt

    das break ist in dem fall auch unreachable code und würde ein warning generieren
    oder wenn du deine bildschirmgröße in einem int gespeichert hast und in ein unsigned int oder short überträgst (und natürlich brav castest und es nicht reinzwingst) ist es auch ok da wohl kaum deine bildschirm breite mehr als 32000 pixel ist oder negativ

    normalerwese kommen eigentlich keine warnings (bei visual studio) wenn man explizit einen cast durchführt (so wie mit dem long und window 😉

    bei deinem compiler scheinbar schon, aber ich würde es einfach mal so hinnehmen in dem fall



  • OK, dann nehm ich das mal so hin.

    Noch zur Info: Ich habe Visual Studio 2005 Professional Edition (deutsche Version). Ich habe alles auf den standard Einstellungen stehen.

    @ wolfgke: Die Warnungen stehen (als Zitate) im ersten Beitrag, unten.
    (Haste wohl übersehen 😉 )


Anmelden zum Antworten