Nicht aufgelöste Funktion?

Rene42

Erfahrenes Mitglied
Hallo Forum,

ich benutze Visual C++ 2008 von Microsoft. Trotzdem weiß ich nicht so genau ob meine Frage in dieses Forum gehört oder ins C++ Forum. Ich schieß einfach mal los und man möge mich bei Irtum korrigieren.

Ich habe angefangen Spieleprogrammierung zu lernen und versuche gerade ersteinmal die groben Grundlagen der Windowsprogrammierung für die Gameshell zu verstehen. Dabei ergibt sich folgendes Problem. Der folgende Quelltext ist aus dem Buch übernommen funktioniert aber nicht :suspekt:

Code:
// Wichtige GAME-Funktionsprototypen
//-----------------------------------------------------------
void Game_Shutdown(void);
void Game_Init(void);
void Game_Main(void);
//-----------------------------------------------------------
// Funktionsdefinitionen
//-----------------------------------------------------------
LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
 PAINTSTRUCT ps;
 HDC hdc;
 // Nachrichtenverarbeitung
 switch(msg)
       {
        case WM_CREATE:       
			{
             return(0);
            }
        break;
        case WM_PAINT:
            {
             hdc = BeginPaint(hwnd,&ps);
             EndPaint(hwnd,&ps);
             return(0);
            }
         break;
         case WM_DESTROY:
             {
              PostQuitMessage(0);
              return(0);
             }
         break;
         default:
         break;
        }
 return (DefWindowProc(hwnd, msg, wparam, lparam));
}
/////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hprevinstance,LPSTR lpcmdline,int ncmdshow)
   {
    WNDCLASSEX winclass;
    HWND hwnd;
    MSG msg;
    // Fenstereigenschaften festlegen:
    winclass.cbSize = sizeof(WNDCLASSEX);
    winclass.style = CS_HREDRAW | CS_VREDRAW;
    winclass.lpfnWndProc = WindowProc;
    winclass.cbClsExtra = 0;
    winclass.cbWndExtra = 0;
    winclass.hInstance = hinstance;
    winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    winclass.lpszMenuName = NULL;
    winclass.lpszClassName = WINDOW_CLASS_NAME;
    winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    hinstance_app = hinstance;
    if(!RegisterClassEx(&winclass))
    return(0);
    if(!(hwnd = CreateWindowEx(NULL,WINDOW_CLASS_NAME,"My Game Shell",WS_OVERLAPPEDWINDOW | WS_VISIBLE,0,0,800,600,NULL,NULL,hinstance,NULL)))
    return(0);
    main_window_handle = hwnd;
    Game_Init();
    while(TRUE) // Nachrichtenweiterleitung
         {
          if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
            {
             if(msg.message == WM_QUIT)
             break;
             TranslateMessage(&msg);
             DispatchMessage(&msg);
            }
          Game_Main();
         }
 Game_Shutdown();
 return(msg.wParam);
}

Dies funktioniert merkwürdigerweise nur dann wenn ich kurz vor Schluss "Game_Shutdown();" auskommentiere. Ansonsten folgt die Fehlermeldung:

main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl Game_Shutdown(void)" (?Game_Shutdown@@YAXXZ)" in Funktion "_WinMain@16".
C:\Dokumente und Einstellungen\Rene\Desktop\Programme\Kapitel_01_GameShell\Debug\Kapitel_01_GameShell.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

Wäre dankbar wenn es sich mal jemand anschauen könnte und vorschläge macht.

Gruß Rene42
 
Hallo,

du solltest noch mal das Buch zu Rate ziehen. Die Funktion "Game_Shutdown();" ist keine Funktion einer Standardbibliothek sondern an irgendeiner Stelle von den Machern des Buches erstellt wurden und muss daher noch zu deinem Quellcode hinzugefügt werden.

Gruß
MCoder
 
Hi,

natürlich habe ich gemerkt, das Game_Shutdown eine selbstdefinierte Funktion ist, daher definiere ich sie ja kurz mit

Code:
void Game_Shutdown(void)

Trotzdem lässt es scih nicht kompilieren

Gruß Rene42
 
Die Deklaration reicht nicht. Da die Funktion im Programm verwendet wird, ist auch die Implementierung erforderlich.

Gruß
MCoder
 
Hi,

dann verstehe ich aber nicht, warum es bei der Funktion Game_Main() keine Schwierigkeiten gibt....

Rene42
 
Das gleiche Probleme sollte bei "Game_Init(void)" und "Game_Main()" natürlich auch auftreten. Allerdings ist der von dir gezeigte Quelltext sicher nicht vollständig, da er so nicht kompilierbar ist. Hast du vielleicht noch weitere Sourcen bzw. Includes in dem Projekt, wo die "Game_Main()" implementiet sein könnte?

Gruß
MCoder
 
Zurück