a pointer to a bound function may only be used to call the function



  • Ich versuche gerade eine Funktionsaddresse die in einem V-Table steht
       auszulesen.
       Technisch wohl möglich, aber anscheinend sind meine C++ Kenntnisse
       ungenügend, um dem Compiler klar zu machen, was ich will.

    Ein Beispiel:

    class vtable
    {
    virtual void foo(void);
    virtual void bar(void);
    };
    
    ...
    
    vtable test = getvtable(...);
    
    //die addresse der "bar" funktion möchte ich in diesem void* pointer zwischen speichern
    void* addr_bar =(void*) test->bar;
    

    Dann kommt leider schon Intellisense mit dem Error:

    a pointer to a bound function may only be used to call the function

    Ich hoffe mir kann jemand helfen!!!



  • darf man fragen warum?
    da das nicht standard konform sein wird und auch zu ganz anderen problemen führen kann...

    zumal ich deinen code beispiel nicht wirklich verstehe

    edi: wobei, aber das sieht ziemlich schräg aus und auch falsch. du kannst doch keine addresse einer funktion in einem void zeiger speichern, wenn solltest du schon einen funktions zeiger nehmen, aber auch der bringt dich nicht weit

    kannst du uns die quelle zeigen wo das steht dass es technisch möglich ist?



  • du kannst doch keine addresse einer funktion in einem void zeiger speichern

    Wieso, ich könnte es auch so schreiben:

    char addresse[4]={0};
    	*(unsigned int*)(char*)addresse =(unsigned int) funktion;
    

    😃



  • ja könntest du. das machst du einmal, keine 2 sekunden später wird der kunde dir die tür eintreten und dich für solch eine programmierung zum teufel jagen, und der allmächtige selbst wird dich wieder wegjagen, weil er keine genügend schlimme strafe für sowas kennt(und falls doch, ist es ihm zu hart deswegen kickt er dich weiter)

    was du da machst, ist ziemlich maschinenspezifisch. und erzeugt früher oder später undefined behavior. klar möglich ist viel, klappen wird auch viel, aber eben nicht überall und immer. kann ja auch sein, dass es nur geklappt hat weil gerade der wind in ostsibirien richtig weht und daher die elekronen in deinem prozessor das richtige getan haben...



  • Skym0sh0 schrieb:

    ja könntest du. das machst du einmal, keine 2 sekunden später wird der kunde dir die tür eintreten und dich für solch eine programmierung zum teufel jagen, und der allmächtige selbst wird dich wieder wegjagen, weil er keine genügend schlimme strafe für sowas kennt(und falls doch, ist es ihm zu hart deswegen kickt er dich weiter)

    was du da machst, ist ziemlich maschinenspezifisch. und erzeugt früher oder später undefined behavior. klar möglich ist viel, klappen wird auch viel, aber eben nicht überall und immer. kann ja auch sein, dass es nur geklappt hat weil gerade der wind in ostsibirien richtig weht und daher die elekronen in deinem prozessor das richtige getan haben...

    du meinst, weil 32-bit addressierung jeden tag aussterben könnte? 😃

    okay:

    char addresse[sizeof(int)]={0};
    *(unsigned int*)(char*)addresse =(unsigned int) funktion;
    


  • wieso aussterben?

    meine waschmaschine hat nichtmals 32bit...



  • @benamezertun: Sieh bitte ein, dass Methodenzeiger größer als int-Zeiger sein können. Spätestens wenn virtuelle Vererbung ins Spiel kommt, ist ein Methodenzeiger auf einem 32-Bit-System auch gerne mal 12 Bytes groß.



  • Skym0sh0 schrieb:

    was du da machst, ist ziemlich maschinenspezifisch. und erzeugt früher oder später undefined behavior. klar möglich ist viel, klappen wird auch viel, aber eben nicht überall und immer. kann ja auch sein, dass es nur geklappt hat weil gerade der wind in ostsibirien richtig weht und daher die elekronen in deinem prozessor das richtige getan haben...

    Quatsch, weil die Gegebenheiten seiner Plattform richtig sind.

    32-Bit Adressierung stirbt aus? Was für ein Schwachsinn...
    Und woher ,Skym0sh0, kennst du die Details des eingebetteten Systems deiner Waschmaschine 😃

    char addresse[sizeof(int)]={0};
    *(unsigned int*)(char*)addresse =(unsigned int) funktion;
    

    Was für ein Dreck. Dann doch lieber gleich

    auto ptr = &funktion;
    


  • Sone schrieb:

    32-Bit Adressierung stirbt aus? Was für ein Schwachsinn...
    Und woher ,Skym0sh0, kennst du die Details des eingebetteten Systems deiner Waschmaschine 😃

    selbst gebaut, programmiert und vor allem GENUTZT ! 😃



  • Technisch wohl möglich

    Nö, nicht innerhalb von Standard-konformen C++.


Anmelden zum Antworten