callback sprungadresse auf klassenfunktion



  • hallo allerseits,
    ich habe folgendes problem:

    ich moechte eine dll einbinden die eine callback funktion beinhaltet. diese callbackfunktion soll einen funktionspointer aus der hauptanwendung bekommen. wenn dieser pointer aber auf eine klassenfunktion zeigt, dann findet er zwar die funktion, aber alle klassenobjekte die vorher erstellt wurden sind null. ich habe es mittlerweile so geloest, dass es eine funktion ausserhalb der klasse gibt, die auf globale variablen zurueckgreift, die wiederum mittels pointer mit der klasse verbunden sind, bin aber ueberhaupt nicht gluecklich damit.
    meine frage also: ist es ueberhauot moeglich eine callbackadresse auf eine klassenfunktion zu setzen? irgendwie sagt mir mein gefuehl, dass es gehen muss, da er die funktion ja auch findet. wahrscheinlich muss man die sprungadresse des klassenkonstruktors mitliefern... egal... jemand da der abhilfe schaffen kann?

    gruessings



  • irgendwie sagt mir mein gefuehl, dass es gehen muss, da er die funktion ja auch findet.

    Ich geb deinem Gefühl man noch was mehr zum nachdenken, mal sehen obs dann immer noch glaubt, dass das gehen muss 🤡

    class Foo {
    public :
    	void func1() { 
               // do something
               int i=0;
               i++;
             };
    };
    typedef void ( Foo::* A_TEST_FUNC)(void);
    int main()
    {
       Foo f[9999999];
    
       A_TEST_FUNC fc1 = f[0].func1;
       A_TEST_FUNC fc2 = f[99].func1;
       A_TEST_FUNC fc3 = f[555].func1;
    //...
    return 0;
    }
    

    Wirf nen blick auf den code oben. Ein kleines Prog das nicht anders macht mach als ein array mit 9999999 elemnten deine Klasse Foo anzulegen. Nun möchtest du nen pointer auf die func1 methode an deine callback übergeben, d.h. jeder f.func1 pointer in deinem array müsste ne andere Addresse haben, damit man sie unterscheiden kann. So weit warst du schon. Wenn wir jetzt ein level tiefer gehen und betrachten was so ne "Adresse" eigentlich darstellt, fangen die ersten zweifel an... das ist eine Stelle im ram. Damit also du also 9999999 verschiedene f.func1 pointer haben kannst, musst der code an 9999999 verschieden stellen im Ram existieren. Dein mini-prog würde also ~99999990 Byte Ram benötigen nur um die 9999999 versionen deine func1 abzulegen 🤡 --> nosense. Der code func1 existiert nur einemal im ram, was das erstaunliche verhanlten erklärt, warum fc1, fc2, fc3,.. alle auf die gleiche stelle im ram zeigen. Zu welcher instance von Foo die function gehöhrt wird über den this pointer der klasse bestimmt.
    Es gibt nun also 2 Möglichkeiten das mit deiner callback zu lösen:
    1. Übergib nen zeiger auf die klassen-instanz

    void my_callback(Foo *p)
    {
       p->func1();
    }
    

    2. mach deine callback Methode static. Das hat den effekt das deine Callback-Methode keine this pointer mehr hat.



  • danke dir. so was hab ich mir schon gedacht. da ja klar war das er die objekte der klasse noch kennt, deren vorherigen values aber nicht mehr, konnte er nur auf die klasseninstanz als solches zeigen. ich dachte mir aber man koennte sich irgendwie von hinten durchhangeln 🙂
    aber nicht so schlimm. ich erzeuge mir nun einen pointer auf das klassenobjekt und mach das ding global, so kann dann die callback funktion wieder auf die klasse zugreifen.
    pointer an die callback selber is doof, da die callback funktion ja aus der dll aufgerufen wird. so muesste ich den pointer an die dll uebergeben um sie dann wieder zu bekommen -> nervt. oder sogar den header der klasse dort einbinden und das geht schon mal gar nicht....
    trotzdem vielen dank


Anmelden zum Antworten