Funktionsparameter/Aufruf (?) : void(*)(void)



  • Hallo bin neu hier, und beschäftige mich innerhalb einer Arduino Library mit einem Funktionsaufruf (?) der mir nicht gelingen will. Da ich nicht alle Fachausdrücke kenne und meine C++ Kenntnisse noch viel Luft nach oben haben, stelle ich diesen Code ein.

    die cpp datei

    #include "Arduino.h"
    #include "Blinken.h"
    
    
    
    Blinken::Blinken(int pin,int lowtime,int hightime, void(*)(void))
    {
    	pinMode(pin, OUTPUT);
    	digitalWrite(pin, HIGH);
    	delay(hightime);
    	digitalWrite(pin, LOW);
    	delay(lowtime);	
    }
    

    die .h datei

    #ifndef Blinken_h
    #define Blinken_h
    #include "Arduino.h"
    
    class Blinken 
    {
    public:
    	Blinken(int pin,int lowtime,int hightime, void(*)(void));
    	
    	
    private:
    	
    };
    #endif 
    
    

    die .ino datei

    void loop() {
      Blinken(13,1000,2000,info);
    }
    void info(){
      Serial.println("es tut...manchmal");
    }
    

    Meine erste Frage ist : wie kann ich in der .cpp mit dem Funktionsparameter/Aufruf (?) : void(*)(void) umgehen bzw. wie sollte dieser verarbeitet werden, damit in der .ino Datei eine Anweisung ausgeführt wird wie hier z.B. void info().
    Die zweite Frage : Wo und unter welchem Schlagwort kann ich Nachschauen ?

    Da ich schon einige Zeit erfolglos damit verbracht habe, freue ich mich für einen Schub´s in die richtige Richtung



  • @DiKu sagte in Funktionsparameter/Aufruf (?) : void(*)(void):

    void loop() {
    Blinken(13,1000,2000,info);
    }

    Da wird ein temporäres Objekt erzeugt und gleich wieder weggeworfen. Das ist wohl eher nicht sinnvoll.

    Das ist aber erst mal kein C++ Problem, sondern eines wie man einen Arduino grundsätzlich programmiert => falsches Forum.

    Edit:

    Offensichtlich ist es so, dass es eine setup und eine loop Funktion gibt. Die Beispiele mit „blinken“ rufen da auch entsprechende Funktionen auf. Warum steckst du genau diese Funktionen in den Konstruktor einer Klasse?



  • @DiKu sagte in Funktionsparameter/Aufruf (?) : void(*)(void):

    Meine erste Frage ist : wie kann ich in der .cpp mit dem Funktionsparameter/Aufruf (?) : void(*)(void) umgehen bzw. wie sollte dieser verarbeitet werden, damit in der .ino Datei eine Anweisung ausgeführt wird wie hier z.B. void info().
    Die zweite Frage : Wo und unter welchem Schlagwort kann ich Nachschauen ?

    Das schlägst du am besten unter dem Stichwort "Funktionszeiger" nach.



  • @DiKu sagte in Funktionsparameter/Aufruf (?) : void(*)(void):

    void(*)(void)

    Das ist die Syntax für einen Funktionszeiger-Typ.
    Wenn du eine Variable definieren willst, musst du dem Ding noch einen Namen verpassen: void(*variableName)(void)

    Und dann kannst du das Ding aufrufen als ob es eine Funktion wäre: variableName()



  • @hustbaer

    Vielen Dank das Ding tut was es soll,

    void Ditsch::Blinken(int pin, int lowtime, int hightime,void(*doSomething)(void))
    {
    	pinMode(pin, OUTPUT);
    	digitalWrite(pin, HIGH);
    	delay(hightime);
    	digitalWrite(pin, LOW);
    	delay(lowtime);
    
    	doSomething();
    	
    }
    

Log in to reply