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... :p

    Aber 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 😉


Anmelden zum Antworten