wo ist hier der fehler?
lima-city → Forum → Programmiersprachen → C/C++ und D
absturz
anmerkung
beitrag
benutzt beitrag
break
compiler
definition
eigene schleife
fenster
funktion
globalen fensters
inhalt
klammern
kommentiert hast
message
null
operation
phase
schleifen
titelleiste
-
ich wei? nicht ob sich das jetzt jemand antut und alles durguckt aber ich f?nds wirklich cool von euch!
//Frame.cpp
//INCLUDES////////////////////////////////////////
#include <windows.h>
#include "Frame.h"
//GLOBALS/////////////////////////////////////////
BOOL done;
int Spiel_Zustand;
HWND hwnd;
//FUNKTIONEN//////////////////////////////////////
//CALLBACK FUNKTION
LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
switch(message)
{
case WM_DESTROY:
{
done = TRUE;
PostQuitMessage(0);
return(0);
} break;
case WM_KEYDOWN:
switch (wparam)
{
case VK_ESCAPE:
{
PostMessage(hwnd, WM_CLOSE, 0, 0);
return 0;
} break;
} break;
default:break;
} //switch zu Ende
return (DefWindowProc(hwnd, message, wparam, lparam));
} //Window Proc zu Ende
//Startfunktionen
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprevinst, LPSTR lpcmdline, int ncmdshow)
{
WNDCLASSEX winclass;
MSG message;
const char szclassname[] = "Klassenname";
DWORD loop_start_time;
winclass.cbSize = sizeof(WNDCLASSEX);
winclass.style = CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hinst;
winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
winclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winclass.lpszClassName = szclassname;
winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if (!RegisterClassEx(&winclass))
return(0);
// Handle zum erzeugen des globalen Fensters
if (!(hwnd = CreateWindowEx(NULL, szclassname, "3D Spieleprogrammierung - Titelleiste", WS_POPUPWINDOW | WS_VISIBLE, 0, 0, 400, 300, NULL, NULL, hinst, NULL)))
return(0);
ShowWindow(hwnd, ncmdshow);
UpdateWindow(hwnd);
done = FALSE;
Spiel_Zustand = SPIEL_AUSWAHL;
//Phase1:
Spiel_Intialisieren();
//Phase2:
//HAUPTSCHLEIFE///////////////////////////////////////////////
while(!done)
{
while(GetMessage(&message,NULL,0,0))
{
TranslateMessage(&message);
DispatchMessage(&message);
} //PEEKMESSAGE
//Startzeit der Hauptschleife
loop_start_time = GetTickCount();
switch(Spiel_Zustand)
{
case SPIEL_AUSWAHL:
{
//code
Spiel_Zustand = SPIEL_START;
} break;
case SPIEL_LAUEFT:
{
//Alles f?rs Game...
} break;
case SPIEL_NEUSTART:
{
//code
Spiel_Zustand = SPIEL_START;
} break;
default:break;
} //switch zu Ende
//Framebremse
while ( (GetTickCount() - loop_start_time) < 20);
} //Hauptschleife zu Ende
//Phase 3:
Spiel_Beenden();
return message.wParam;
} // WinMain zu Ende
//Phase1:
int Spiel_Intialisieren(void)
{
//zu Erledigen:
//Intialisierungen
return 1;
}
//Phase3:
int Spiel_Beenden(void)
{
//zu Erledigen:
//Speicher freigeben etc.
return 1;
}
//Frame.h
//DEFINITIONEN////////////////////////////////////
#define WIN32_LEAN_AND_MEAN
#define SPIEL_AUSWAHL 0
#define SPIEL_START 1
#define SPIEL_LAUEFT 2
#define SPIEL_NEUSTART 3
//MAKROS//////////////////////////////////////////
//noch keine vorhanden
//PROTOTYPEN//////////////////////////////////////
int Spiel_Intialisieren(void);
int Spiel_Beenden(void);
Beitrag ge?ndert am 24.11.2005 16:17 von andieo -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
ich hab durchgeguckt, es sind alles klammernpaare, das hei?t, es fehlt keine klammer.
Beitrag ge?ndert am 24.11.2005 16:22 von ruehrer -
Hmmm ich hab's mal getestet (unter BCB und VC++) es wird richtig kompiliert und auch ausgef?hrt ohne Probs also kein Absturz.
Aber man sollte mal anmerken das frame.h nen Header ist der im Includeverzeichnis schon besteht also gib dem mal nen anderen Namen und um mehrmaliges includen zu verhindern solltest den Inhalt von frame.h mal so ?ndern
#ifndef frameH
#define frameH frameH
//Frame.h
//DEFINITIONEN////////////////////////////////////
#define WIN32_LEAN_AND_MEAN
#define SPIEL_AUSWAHL 0
#define SPIEL_START 1
#define SPIEL_LAUEFT 2
#define SPIEL_NEUSTART 3
//MAKROS//////////////////////////////////////////
//noch keine vorhanden
//PROTOTYPEN//////////////////////////////////////
int Spiel_Intialisieren(void);
int Spiel_Beenden(void);
#endif //frameH
Zu deinem eigentlichen Prob guck mal alle Compiler/Linkereinstellung Flags etc. durch ob da nicht was falsch eingestellt ist und der was falsch Link
Aso w?re sch?n zu wissen welchen Compiler du benutzt.
Beitrag ge?ndert am 24.11.2005 17:49 von funkdoobiest -
Das Problem liegt an der Stelle, wo du deinen Quelltext mit "Phase 2\r\nHauptschleife" kommentiert hast. Dein Programm l?uft so lange in der "while (GetMessage(&message,NULL,0,0))"-Schleife, bis es die Nachricht WM_QUIT bekommt (also beendet werden soll). Der Rest deiner "while (!done)"-Schleife ist also v?llig nutzlos.
Deine "Hauptschleife" darf also eigentlich nur so aussehen:
while(GetMessage(&message,NULL,0,0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}
und gleich danach das Ende des Programmes mit
return message.wParam; // Ende von WinMain
Eine eigene Schleife musst du woanders einbauen. Du k?nntest das in die WindowProc einbauen, was aber fast immer eine schlechte Idee ist, da dein Fenster bei l?ngeren Operationen dann "einfriert". Du musst f?r deine eigene Schleife einen neuen Thread starten.
?brigens sieht deine WindowProc schlimm aus
Hier mal eine saubere Version (einfacher lesbar, l?st aber dein Problem nicht):
LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
switch(message)
{
case WM_DESTROY:
done = TRUE;
PostQuitMessage(0);
return(0);
case WM_KEYDOWN:
switch (wparam)
{
case VK_ESCAPE:
PostMessage(hwnd, WM_CLOSE, 0, 0);
return 0;
}
} //switch zu Ende
return (DefWindowProc(hwnd, message, wparam, lparam));
}
Beitrag ge?ndert am 25.11.2005 12:31 von 0-checka
Beitrag ge?ndert am 25.11.2005 12:32 von 0-checka -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage