Problem mit Framework-Klasse bei Allegro



  • Hallo,

    weil ich Allegro doch ab und an hernehme, habe ich mir überlegt, das alte C "Framework" in eine Klasse zu stopfen. Nur leider bekomme ich da ein Problem mit dem Timer:

    Klasse "Framework", Funktion "Init":

    //in der Klasse wird der Timer so installiert:
    install_int_ex(timerCounterUpdater, BPS_TO_TIMER(fps));
    

    Der Timer in seiner Urversion:

    volatile int timerCounter = 0;
    
    static void timerCounterUpdater() {
        timerCounter++;
    }
    END_OF_STATIC_FUNCTION(timerCounterUpdater);
    

    Ich habe versucht, den Timer als Memberfunktion von Framework einzubauen, was Kompilerfehler verursacht, ich hab ich ihn draußen gelassen und hab einen Kompilerfehler bekommen, kurz ich hab nicht die geringste ahnung, was ich machen soll. Wie kann ich den Timer in die Klasse einbauen? Danke.



  • Hab ich mich zu verwirrenend ausgedrückt? War ich auch ziemlich...
    Also im Prinzip geht es mir nur darum, wie ich aus der Klasse heraus die statische Funktion (mit ihrer Adresse) installieren kann.



  • Was macht END_OF_STATIC_FUNCTION kann gut sein, dass das Makro innerhalb einer Klassendefinition ungültigen Code enthält.



  • Was END_OF_STATIC_FUNCTION() genau macht, weiß ich nicht, aber dass es (noch) kein Problem verursacht, schon. Ich hab es einfach auskommentiert und es kommt trotzdem der gleiche Fehler. Es liegt wohl doch an mir. 🙂

    So siehts im Moment aus:

    Header

    //... 
    public:
      static volatile int timerCounter;
      static void timerCounterUpdater();
      //...
    

    Cpp-Datei

    bool framework::init()
    {
     //...
     // Timer Funktionen und Variablen locken 
      LOCK_FUNCTION(timerCounterUpdater);
      LOCK_VARIABLE(timerCounter);
    
      // Die logische Framerate setzen
      install_int_ex(timerCounterUpdater, BPS_TO_TIMER(fps));
     //...
    }
    
    static void framework::timerCounterUpdater(){ //diese Zeile ist beim Fehler markiert
      ++framework::timerCounter;
      }
    END_OF_STATIC_FUNCTION(framework::timerCounterUpdater);
    

    Fehler:

    error: cannot declare member function 'static void framework::timerCounterUpdater()' to have a static linkage
    


  • Mach das static weg, das musst du nur bei der Klassendefinition hinschreiben.
    In einer .cpp-Datei (einem Modul/Übersetzungseinheit) bedeutet ein static, dass diese Funktion nur internal linkage hat, damit kann man diese Funktion nicht von außerhalb aufrufen (das gleiche passiert bei einem anonymen namespace).



  • nimm das static bei der implementierung weg



  • Danke, der Fehler ist weg. Aber:

    .objs\framework.o:framework.cpp:(.text+0x6d2): undefined reference to `framework::timerCounter'
    

    Was heißt das jetzt schon wieder? 😕 timerCounter ist doch auch statisch und noch dazu (im Moment) public - also wie eine globale Variable. Warum findet der Linker den timerCounter dann nicht?
    Tut mir leid, wenn dumme Fragen stelle, aber mit statischen Membern habe ich mich noch nie befasst.



  • Weil du sie nur deklariert hast in deiner Klassendefinition, schreib in die .cpp

    int framework::timerCounter = 0;



  • Danke! Jetzt hats geklappt. Leider gibts wieder ein aber: Das Testprogramm startet und zeigt mir netterweise an: "Unable to install the timer". Das wars dann wohl, oder? 😞

    bool framework::init()
    {
     //...
     // Timer Funktionen und Variablen locken
      LOCK_FUNCTION(framework::timerCounterUpdater);
      LOCK_VARIABLE(framework::timerCounter);
    
      // Die logische Framerate setzen
      install_int_ex(framework::timerCounterUpdater, BPS_TO_TIMER(fps));
     //...
    }
    

    So sieht die "Installation" des Timer aus.

    Naja, wenigstens kann ich jetzt mit dem statischem Kram umgehen. Nochmals vielen Dank.



  • man man man, lern die Sprache
    Lies dir die Macros durch, und verstehe was sie machen
    Schau in die install Funktion und suche dort nach der Stelle wo diese Fehlermeldung entsteht und versuche zu verstehen warum sie entsteht.



  • Gut, jetzt gehts. 🙂


Anmelden zum Antworten