Methoden Adresse für Vektortabelle



  • Hallo,

    in einem embedded Projekt habe ich mit C++ begonnen. In einer Klasse cUSART habe ich eine Methode cUSART::rx_isr(). Die Adresse für diese Methode muss in einer Vektortabelle eingetragen werden.

    Das habe ich so versucht. Dabei ist das nur ein Auszug aus der Tabelle. default_isr wird für alle nicht benutzten Vektoren eingetragen:

    ...
    default_isr,
    &term.rx_isr,
    default_isr,
    ...

    term ist eine Instanz von cUSART. Leider gibt mir der Compiler (IAR) diese Fehlermeldung aus:

    Error[Pe300]: a pointer to a bound function may only be used to call the function.

    Wie kann man so eine Methodenadresse richtig in eine Vektortabelle eintragen?

    Grüße

    BitConverter



  • Die Adresse von rx_isr() bekommst du so:

    &cUSART::rx_isr
    

    War das die Frage?



  • Hallo wx++,

    danke für Deine Antwort. Ich brauche die Adresse von der Instanz "term" - also term.rx_isr(). Es gibt halt mehrere Instanzen von cUSART, z.B. auch eine Instanz usart_gps.

    Grüße

    BitConverter()



  • Die Adresse von term ist &term. Die Adresse von term::rx_isr gibt es nicht, weil die Funktion nur einmal für alle Instanzen im Speicher liegt.
    Wahrscheinlich suchst du folgendes:

    returntype (cUSART::*method)() = &cUSART::rx_isr;
    cUSART* object = &term;
    
    //aufruf:
    (object->*method)();
    


  • Was ist eine Vektortabelle?



  • Grundsätzlich: Zur Speicherung und dem Aufruf einer nicht-statischen Methode, ist immer zusätzlich ein Instanzzeiger nötig. In C++ umgeht man dieses Problem gerne durch eine weitere Ebene der Indirektion (z.B. via std::tr1::function bzw. boost::function, das ein Funktionsobjekt erzeugt, das in einem solchen Fall intern beide Zeiger hält).

    Es gibt keinen portablen Weg mit nur einem Zeiger für eine nicht-statische Methode auszukommen.



  • Was ist ein Instanzzaehler ... 🙂



  • knivil schrieb:

    Was ist ein Instanzzaehler ... 🙂

    Eine unsinnige Erfindung eines müden Geistes (Vermutlich steht der Zähler für die Schafe). Habs korrigiert 😉


Anmelden zum Antworten