- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 17

Thema: Callback Funktion mit static function pointer

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.12.2005
    Ort
    @FFM
    Alter
    48
    Beiträge
    408

    Callback Funktion mit static function pointer

    Hallo zusammen ich habe ein Problem bei der Umsetzung einer callback Funktion..

    Ziel soll sein das aus einer Klasse(TrackControl) heraus eine Funktion (sendmidi) im Haupt Sketch aufgerufen wird
    dazu wollte ich einem static function pointer der Klasse die Referenz auf die Funktion übergeben.
    Die einzelnen Instanzen der Klasse sollen dann die Funktion im Hauptsketch aufrufen können.
    Ich habe das ganze schon umgeschrieben gehabt auf "extern void sendMidi (byte value);" und das hat funktioniert aber ich würde gern wissen
    wie das mit dem callback richtig gemacht wird.

    Code Hauptsketch:
    Code:
    #include "TrackControl.h"
    //void sendMidi (byte); //prototyp needed ?
    TrackControl trackcontrol[8];
    void setup() {
      TrackControl::setCallback(&sendMidi);
      Serial.begin(9600);
    }
    void loop() {
      trackcontrol[0].setVolume(1); 
      delay(1000);
    }
    void sendMidi (byte value){
      Serial.print(value);
    }
    TrackControl.h:

    Code:
    #ifndef TrackControl_h
      #define TrackControl_h
      #include <arduino.h>
    
      class TrackControl {
        static void (*sendmidi)(byte); //pointer to function
        public:
          void setVolume (byte value);
          static void setCallback (void (*pCallbackFunction)(byte)); //static method to setup callback function for all instances
      };
    
    #endif
    TrackControl.cpp

    Code:
    #include "TrackControl.h"
    #include <arduino.h>
    
    void TrackControl::setCallback (void (*pCallbackFunction)(byte)){
      sendmidi=pCallbackFunction;
    }
    
    void TrackControl::setVolume (byte value){
      sendmidi(value);
    }
    Danke für eure Hilfe ..

  2. #2
    shedepe
    Gast
    Um mal kurz in blaue zu Fragen: Was geht denn nicht? Macht das beantworten einfacher, dann muss man eventuell den Code nicht mal anschauen

    Prinzipiell hast du schon alles richtig gemacht. Du brauchst eine Statische Instanz des Callbacks. Da fehlt in der Cpp Datei noch

    void (*TrackControl::sendmidi)(byte) = 0

    eben weil es ja eine statische Variable sein soll.
    Weil die Syntax bisschen nervig wird auf Dauer verwendet man für Functionpointers gerne typedefs.
    Also z.B. in der Klasse drin:

    Code:
    typedef void (*sendmidi_fptr)(byte);
    static sendmidi_ftpr callback;
    
    und im cpp:
    TrackControl::sendmidi_ftpr TrackControl::callback = 0;
    Ansonsten ist die idee wie gesagt gut so:
    Man hat eine setCallback Funktion und ruft den wie du es gemacht hast eben auf.
    Ich würde vom Design her gerade bei Funktionspointern statische instanzen davon vermeiden, sondern lieber jeder Instanz den Pointer einzeln mitgeben. Das hat weniger Risiko für Nebenwirkungen wenn der Code mal komplexer wird.

    Edit was ich noch vergessen habe: Das funktioniert so nur für Funktionen die außerhalb einer Klasse sind bzw. statisch in einer Klasse sind. Willst du einen Funktionspointer auf eine Memberfunction übergeben kannst du das nicht mit einem klassischen Funktionspointer so ohne Probleme machen. Mit C++ am PC geht das am besten mit std::function. Es es das auch für arduino gibt weiß ich nicht.
    Geändert von shedepe (09.03.2018 um 23:10 Uhr)

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.12.2005
    Ort
    @FFM
    Alter
    48
    Beiträge
    408
    Hallo shepede ..
    Danke für deine Antwort .. als VB.Net Hobbyist kann ich das nur nicht umsetzten
    meiner Meinung nach habe ich einen Funktionspointer in der Header Datei deklariert
    und mit deiner "void (*TrackControl::sendmidi)(byte) = 0" initialisiert
    die cpp sieht jetzt so aus:
    Code:
    #include "TrackControl.h"
    #include <arduino.h>
    
    void TrackControl::setCallback (void (*pCallbackFunction)(byte)){
      void (*TrackControl::sendmidi)(byte) = 0;
      TrackControl::sendmidi=pCallbackFunction;
    }
    
    void TrackControl::setVolume (byte value){
      sendmidi(value);
    }
    die Fehlermeldung lautet:
    sketch/TrackControl.cpp:6: undefined reference to `TrackControl::sendmidi'

    die Lösung mit der statischen Klassen Funktion habe ich gewählt da ich sonst in jeder Instanz noch einen Pointer bräuchte und schon bei 70Prozent dynamischer Speicherauslastung bin
    und dann noch für 128 Instanzen Pointer bräuchte.

  4. #4
    shedepe
    Gast
    Lies dir noch mal durch wie man in C++ Statische Variablen verwendet. https://de.wikibooks.org/wiki/C%2B%2...nte_in_Klassen
    Nur im Headerfile anlegen reicht nicht, weil das dem Compiler nur sagt, es soll so eine Variable geben. Erst durch anlegen im C++ File wird diese auch wirklich erst im Speicher erstellt.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.12.2005
    Ort
    @FFM
    Alter
    48
    Beiträge
    408
    und was ist mit der
    void (*TrackControl::sendmidi)(byte) = 0;

    in der cpp ist das keine Intitialisierung ?

  6. #6
    shedepe
    Gast
    Schau dir mal an was du geposted hast. Da steht das in einer Funktion drin.
    void TrackControl::setCallback (void (*pCallbackFunction)(byte)){
    void (*TrackControl::sendmidi)(byte) = 0;

Ähnliche Themen

  1. Antworten: 9
    Letzter Beitrag: 17.02.2016, 21:09
  2. static inline ? warum static
    Von Siro im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 22.12.2010, 14:41
  3. Function Pointer - Verständnissproblem
    Von s.o. im Forum C - Programmierung (GCC u.a.)
    Antworten: 11
    Letzter Beitrag: 01.05.2008, 10:34
  4. Static int Problem
    Von Spongebob85 im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 20.01.2007, 00:25
  5. static beisst volatile
    Von StefPan im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 02.10.2006, 18:54

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress