error C3867 Funktion aus einer Klasse aufrufen



  • Hallo,

    habe folgendes Problem...und zwar hab ich mir eine Klasse gebaut die heißt

    #ifndef __OPENCAM_H
    	#define __OPENCAM_H
    
    #include "Fl_Files.h"
    
    class OpenCam
    {
    	public:
    		OpenCam(Fl_OpenCV*, Fl_Scroll*, bool);
    		void Playing_CB();
    };
    
    //
    
    #endif //__OPENFILE_H
    
    #include "../h/OpenCam.h"
    #include "../h/allFiles.h"
    
    Fl_Capture Cap;
    bool playing;
    
    OpenCam::OpenCam(Fl_OpenCV* temp, Fl_Scroll* Board, bool playing){
    	if( !Cap.CaptureFromCAM(0) ) return;
    	temp->SetImage(Cap.GetFrame());
    	Board->redraw();
    	playing=true;
    	Fl::add_timeout(0.05, Playing_CB);
    }
    
    void OpenCam::Playing_CB(){
      if(playing==false) return;
    	img=Cap.GetFrame();
    	temp->SetImage(img);
    	Fl::wait(0);
    	Fl::add_timeout(0.01, Playing_CB);
    }
    

    Und habe ich das Problem das bei der Zeile
    Fl::add_timeout(0.05, Playing_CB);
    die Fehlermeldung kommt
    error C3867: "OpenCam::Playing_CB": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&OpenCam::Playing_CB", um einen Zeiger auf den Member zu erstellen.

    add_timeput(double t, Fl_timeout_Handler, void* =0)

    Kennt jemand das Problem?????



  • Lesen hilft:

    funscripter1983 schrieb:

    Verwenden Sie "&OpenCam::Playing_CB", um einen Zeiger auf den Member zu erstellen.



  • ...auf die Idee bin ich auch gekommen!!

    Da es nicht funktioneirte habe ich gedacht ich Frag hier mal nach 😉

    ...wenn ich
    void &OpenCam::Playing_CB(){

    ...bekomme ich folgenden Fehler

    Fehler 33 error C2556: 'int &OpenCam::Playing_CB(void)': Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von 'void OpenCam::Playing_CB(void)



  • Kann es sein das Du in der "Playing_CB" definition ein argument vergessen hast versuche mal

    void OpenCam::Playing_CB( void* ) {
    ..
    ..
    ..
    }

    gruß

    PS : Zumindest spuckt g**gle für die definition von Fl_timeout_Handler folgendes aus

    typedef void (*Fl_Timeout_Handler)(void*);



  • ...hab ich auch schon versucht.

    Dann bringt er mir aber diese Fehlermeldung

    "error C3867 OpenCam::Playing_CB": Dem Funktionsaufruf fehlt die Argumentenliste. Verwenden Sie &OpenCam::Playing_CB", um einen Zeiger auf den Member zu erstellen"

    ...wenn ich dann

    &OpenCam::Playing_CB(void *){
    ...
    }

    bekomm ich Fehler "C2182: Playing_CB: Unzulässige Verwendung des Types 'void'"
    und den Fehler "C2556" int &OpenCam::Playing_CB(void): Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von 'void OpenCam::Playing_CB(void)"**

    ...wobei der Fehler C3867 bleibt...dreh mich da ein bischen im Kreis herum!! 😞



  • Du sollst nicht bei der Funktionsdeklaration ein & hinzufügen. Du sollst beim Aufruf von add_timeout &OpenCam::Playing_CB statt Playing_CB schreiben.



  • ...entweder bin ich zu dumm dafür oder das klappt nicht.

    OpenCam::OpenCam(Fl_OpenCV* Pict, Fl_Scroll* Board){
    	copy_Pict = Pict;
    	if( !Cap.CaptureFromCAM(0) ) return;
    	Pict->SetImage(Cap.GetFrame());
    	Board->redraw();
    	playing=true;
    	Fl::add_timeout(0.05, &OpenCam::Playing_CB);
    }
    
    void OpenCam::Playing_CB(){
      if(playing==false) return;
    	img=Cap.GetFrame();
    	copy_Pict->SetImage(img);
    	Fl::wait(0);
    	Fl::add_timeout(0.01, &OpenCam::Playing_CB);
    }
    

    Fehlermeldung
    Fehler 31 error C2664: 'Fl::add_timeout': Konvertierung des Parameters 2 von 'void (__thiscall OpenCam:: )(void)' in 'Fl_Timeout_Handler' nicht möglich*

    ...und nun?! 😞

    Hab es bis jetzt als normale Funktion deklariert...funktioniert auch soweit bis auf dass, das es kein richtiger Callback ist...



  • wie schon geschrieben, falls der callback so definiert is

    typedef void (*Fl_Timeout_Handler)(void*);
    

    muss die funktion so aussehen

    void Playing_CB(void* irgendwas)
    {
      // ...
    } 
    //...
    Fl::add_timeout(0.01, &Playing_CB);
    

    die funktion darf keine memberfunktion sein.
    müsstest also sowas machen

    void Playing_CB(void* openCam){
      OpenCam* oc = (OpenCam*)openCam;
      if(oc->Playing()==false) return;
       ...
    }
    
    void OpenCam::OpenCam(Fl_OpenCV* Pict, Fl_Scroll* Board){
        Fl::add_timeout(0.05, &Playing_CB, this); // der 3. parameter wird Playing_CB übergeben (siehe oben)
    }
    


  • ...hab es jetzt doch wieder so gemacht wie ichs hatte.

    So wie ihoernchen es auch macht.

    DANKE AN ALLE für eure Hilfe 🙂


Anmelden zum Antworten