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 parameterswitch (uMsg) // Evaluate Window Message { case WM_SYSCOMMAND: // Intercept System Commands { switch (wParam) ... break; // Exit } return 0; //<------warning C4702warning 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 negativnormalerwese 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
)