Problem bei Buch-Programm
-
Hi,
Ich arbeite gerade das Buch "C++ für Spieleprogrammierer" von Heiko Kalista durch.
Ich habe soweit alles richtig gemacht, nur kommen eben ein paar Fehlermeldungen, die ich so überhaupt nicht verstehe:
#include "CFramework.hpp" #include "CGame.hpp" int main (int argc, char *argv[]) { // Framework initialisieren if (g_pFramework->Init (800, 600, 16, true) == false) return (0); // Neue Instanz des Spiels CGame Game; // Spiel initialisieren Game.Init (); // Spiel laufen lassen. Diese Funktion läuft so lange, // bis das Spiel geschlossen oder die Escape-Taste // gedrückt wird Game.Run (); // Spiel beenden Game.Quit (); // Framework beenden g_pFramework->Quit (); g_pFramework->Del (); return (0); }Bei diesem Quelltext(ist der gesamte) kommen _5_ Fehlermeldungen:
C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\SDL_Game\main.cpp(7)error C2143: Syntaxfehler : Fehlendes ')' vor ';'
C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\SDL_Game\main.cpp(7) : warning C4390: ';' : Leere kontrollierte Anweisung aufgetreten; ist dies beabsichtigt?
C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\SDL_Game\main.cpp(7) : error C2143: Syntaxfehler : Fehlendes ';' vor '->'
C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\SDL_Game\main.cpp(7) : error C2059: Syntaxfehler : ')'
C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\SDL_Game\main.cpp(25) : error C2143: Syntaxfehler : Fehlendes ';' vor '->'
C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\SDL_Game\main.cpp(26) : error C2143: Syntaxfehler : Fehlendes ';' vor '->'
Fehler beim Ausführen von cl.exe.main.obj - 5 Fehler, 1 Warnung(en)
Ich komm echt nicht weiter

Hoffe, mir kann jemand helfen.
mfG
-
ähm... hab das hübsche bunte büchlein grad vor mir liegen

Also, herzlichen glückwunsch erstmal, den code deiner main funktion hast du schon mal richtig abgetippt, der fehler ist wahrscheinlich auch gar nicht in der datei, schau lieber in den ganzen headern nochmal nach, hast evtl n semikolon am ende deiner klassendeklaration vergessen oder sowas doofes, da löuft der compiler natürlich amok und sucht sich das nächstbeste ende für die klassendeklaration, die dann aber dummerweise in deiner main liegt.
Wie gesagt... gug dir mal die header nochmal an...
-
Laut diesen Fehlermeldungen ist "g_pFramework" nicht definiert!
Also schau mal in den headern nach, wo is definiert sein könnte bzw. poste den inhalt der header!
-
Naja, g_pFramwork ist vom Typ CFramework:
#ifndef FRAMEWORK_HPP #define FRAMEWORK_HPP #include <iostream> #include <SDL.h> #include "Singleton.hpp" #include "CTimer.hpp" using namespace std; #define g_pFramework CFramework::Get(); class CFramework : public TSingleton<CFramework> { public: bool Init( int ScreenWidth, int ScreenHeight, int ColorDepth, bool bFullscreen); void Init(); void Update(); void Clear(); void Quit(); void Flip(); bool KeyDown(int Key_ID); SDL_Surface *GetScreen(){ return m_pScreen;} private: SDL_Surface *m_pScreen; //Surface für den Screen Uint8 *m_pKeyState; //Array für den aktuellen Keystatus }; #endif //----> #include "CFramework.hpp" //Init: Framework Initialisieren bool CFramework::Init( int ScreenWidth, int ScreenHeight, int ColorDepth, bool bFullscreen) { //ALle SDL-Systeme initialisieren if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1 ) { cout << "SDL konnte nicht initialisiert werden!"<< endl; cout << "Fehlermeldung:" << SDL_GetError() << endl; Quit(); return (false); } //Vollbild oder Fenstermodus einstellen if(bFullscreen == true ) m_pScreen = SDL_SetVideoMode(ScreenWidth, ScreenHeight, ColorDepth, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN ); else m_pScreen = SDL_SetVideoMode(ScreenWidth, ScreenHeight, ColorDepth, SDL_HWSURFACE | SDL_DOUBLEBUF); //Hat alles funktioniert? if(m_pScreen == NULL) { cout << "Videomodus konnte nicht gesetzt werden!" << endl; cout << "Fehlermeldung:" << SDL_GetError() << endl; Quit(); return (false); } //Zeiger auf internes Array für Tastaturstatus ermitteln m_pKeyState = SDL_GetKeyState(NULL); //Alles ging glatt, also true zurückliefern return (true); }//Init void CFramework::Quit() { SDL_Quit(); }//Quit void CFramework::Update() { //Timer updaten g_pTimer->Update(); //Tastaturstatus ermitteln SDL_PumpEvents(); }//Update bool CFramework::KeyDown(int Key_ID) { //Prüfen, ob Taste gedrückt ist return (m_pKeyState[Key_ID] ? true : false); }//KeyDown //Clear: Buffer löschen void CFramework::Clear() { //BUffer(Surface) mit Hintergrundfarbe füllen SDL_FillRect(m_pScreen, NULL, SDL_MapRGB(m_pScreen->format, 0, 0, 0)); }//clear //Flip: Surface umschalten void CFramework::Flip() { SDL_Flip(m_pScreen); }//Flip(Ich hab' jetzt mal die *.cpp und die *.hpp Datei direkt untereinander gesetzt.)
, welche von der Klasse TSingleton erbt:#ifndef SINGLETON_HPP #define SINGLETON_HPP template <class T> class TSingleton { protected: // Membervariablen static T *m_pSingleton; // Statisches Objekt public: // Memberfunktionen // Destruktor // virtual ~TSingleton () { } // Get // // Aufgabe: Wenn nötig, statisches Objekt erzeugen und // Zeiger darauf zurückgeben // inline static T* Get () { // Existiert schon eine Instanz? if (!m_pSingleton) m_pSingleton = new T; // Nein, dann neue Instanz erzeugen // Zeiger auf die Instanz zurückgeben return (m_pSingleton); } // Get // Statisches Objekt freigeben // static void Del () { // Gab es eine Instanz? if (m_pSingleton) { delete (m_pSingleton); // Ja, dann freigeben m_pSingleton = NULL; // und Zeiger auf NULL setzen } } // Del }; // Die statische Variable erzeugen // template <class T> T* TSingleton<T>::m_pSingleton = 0; #endif.
Ich sehe da soweit keinen Fehler...aber ich bekomm' grad' auch beim Timer Fehler
Warum das nicht geht, weiß ich nicht
kann man in C++ eigentlich z.B. return true; scheiben, oder muss es return(true); sein?
-
Hallo
planschkuh schrieb:
kann man in C++ eigentlich z.B. return true; scheiben, oder muss es return(true); sein?
Du kannst die Klammern weglassen.
chrische
-
ok, danke

Naja, der Fehler lag in dieser zeile:
#define g_pFramework CFramework::Get();
ihr seht schon, das Semikolon

-
Hallo
Manchmal sucht man sich wirklich blöd nach solchen Fehlern.
chrische
-
--------------------Konfiguration: SDL_Game - Win32 Debug--------------------
Kompilierung läuft...
Sprite.cpp
Linker-Vorgang läuft...
msvcrt.lib(MSVCRT.dll) : error LNK2005: _exit bereits in LIBCD.lib(crt0dat.obj) definiert
msvcrt.lib(MSVCRT.dll) : error LNK2005: _strncpy bereits in LIBCD.lib(strncpy.obj) definiert
msvcrt.lib(MSVCRT.dll) : error LNK2005: _fgetc bereits in LIBCD.lib(fgetc.obj) definiert
msvcrt.lib(MSVCRT.dll) : error LNK2005: _fclose bereits in LIBCD.lib(fclose.obj) definiert
msvcrt.lib(MSVCRT.dll) : error LNK2005: _setvbuf bereits in LIBCD.lib(setvbuf.obj) definiert
msvcrt.lib(MSVCRT.dll) : error LNK2005: __isctype bereits in LIBCD.lib(isctype.obj) definiert
LIBCD.lib(crt0init.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULT:Bibliothek verwenden
Debug/SDL_Game.exe : fatal error LNK1169: Ein oder mehrere mehrfach definierte Symbole gefunden
Fehler beim Ausführen von link.exe.SDL_Game.exe - 7 Fehler, 1 Warnung(en)
Nach der Ausmerzung von ungefähr 100 Fehlern(^^) habe ich diese Fehler bekommen. Ich wüsste natürlich sehr gern, wie ich die auch noch beseitigen kann.
Sagt mir im Mom nichts
-
eine lmitgelinkte lib wurde mit Multihreaded compiliert, eine andere oder das programm mit Multithreaded DLL
Die code generation muss bei allen gelinkten libs gleich sein.
-
planschkuh schrieb:
Naja, der Fehler lag in dieser zeile:
#define g_pFramework CFramework::Get();was soll man da sagen... selber schuld.
Man wird doch überall immer wieder in allen büchern und tuts darauf hingewiesen, dass man bei makros aus prinzip höllisch aufpassen soll, weil man ansonsten den fehler ne ewigkeit lang suchen muss, weil die nicht dort gemeldet werden, wo sie entstehen, sondern dort, wo der precompiler sie reinpackt... Na gut, wird sich wohl nie wieder vorkommen, stimmts

Was die anderen fehler angeht:
Wahrscheinlich sagt Maxi grad das richtige. Ich raff grad leider nicht was... :pAber meine erfahrung bei den LNK-fehlern: wenn so ein fehler kommt, einfach alle compilierte dateien löschen und das gesammte projekt neucompilieren... Mei M$ VS gehn diese doofen fehler dann bei mir meistens einfach so weg
