Funktion aus Klasse aufrufen



  • Anbei, Fehlermeldung?

    Muss ich mit bind() (?!?) arbeiten?!

    Fehlermeldung


  • Mod

    Dieser Beitrag wurde gelöscht!

  • Mod

    Ach, nun komm! Die vier Zeilen Text musst du als Bild bei einem externen Anbieter hochladen, anstatt hier Copy&Paste zu nutzen? Das kann doch unmöglich Zeit gespart haben, und selbst wenn, ist es nicht die Aufgabe des Fragestellers, möglichst wenig Arbeit beim Erstellen einer Frage zu brauchen - im Gegenteil. Und dann nicht einmal der Code dazu? Vielleicht überdenkst du die Art der Fragestellung noch einmal, denn du brauchst Hilfe?

    PS: Auch wenn es didaktisch nicht richtig ist, die Frage jetzt trotzdem zu beantworten: Vielleicht ist bind das richtige Mittel, ja. Dein Problem ist ja, dass Callback_1 zwei Parameter erwartet, aber du beim Aufruf keinen einzigen lieferst. Jetzt ist die Frage, wer soll diese Parameter liefern? Derjenige, der den Callback übergeben hat? Ja, dann kann man mittels bind aus einer Funktion, die eigentlich zwei Parameter erwartet, stattdessen ein funktionsartiges Objekt machen, das sich wie eine Funktion ohne Parameter verhält und intern dann die gebundenen Parameter einsetzt. Dieses kann man dann als Callback übergeben.

    Oder sollte der Caller die Parameter liefern? Dann fehlen sie schlichtweg in deinem Code.

    Aber es ist ein bisschen rätselhaft, was gewollt ist, denn die Fehlermeldung kommt an dieser Stelle ein bisschen spät. Der Callback-Member ist ja schon so definiert, dass er zwei Argumente erwartet. Das liegt ja alles beim Callback-Nutzer, nicht bei dem, der den Callback liefert. Ist das nun so gewollt oder nicht? Das hat mit bind unmittelbar erst einmal nichts zu tun, das ist einfach inkonsistent und du musst erst einmal nachdenken, was du überhaupt möchtest. bind kann dann evtl. bei der Umsetzung nötig sein, aber bind alleine reicht nicht, um dieses Problem zu lösen.



  • @SeppJ sagte in Funktion aus Klasse aufrufen:

    ... die eigentlich zwei Parameter erwartet, stattdessen ein funktionsartiges Objekt machen, das sich wie eine Funktion ohne Parameter verhält und intern dann die gebundenen Parameter einsetzt. Dieses kann man dann als Callback übergeben. ...

    Darum geht es genau in diesem Falle, mein Vorschlag für eine Nutzung der Funktion callback():

    ... ->callback(MainWindow::Callback_1(Fl_Widget*, void* ));
    

    Aber das ist falsch, ich bekomme diesen Ausdruck nicht hin...



  • Wenn du diese Funktion als Callback setzen möchtest, dann nur den Namen angeben (ohne die Klammern und Parameter):

    durchmesser->callback(MainWindow::Callback_1);
    

    bzw. da der obige Code im Konstruktor von MainWindow steht, einfach

    durchmesser->callback(Callback_1);
    


  • Bringt - Ausgabe



  • Wie ist denn die Funktion durchmesser->callback(...) deklariert (also welchen Typ hat der Parameter genau)?
    Laut Fehlermeldung darfst du dort keine nicht statische Memberfunktion übergeben, sondern nur freie Funktionen oder statische Klassenfunktionen.

    Wenn der 2. Parameter (void*) ein beliebiger "user value" ist, dann kannst du dort den Zeiger auf die Klasseninstanz mitgeben und dann innerhalb der Callback-Funktion passend casten und eine Memberfunktion der Klasse damit aufrufen, z.B.

    // in header
    class MainWindow
    {
      static void StaticCallback(Fl_Widget *w, void *data);
    };
    
    // in source
    void MainWindow::StaticCallback(Fl_Widget *w, void *data)
    {
      MainWindow* mainWindow = static_cast<MainWindow*>(data);
      mainWindow->Callback_1(w); // data wird dann nicht mehr als Parameter benötigt
    }
    


  • Fl_Input *durchmesser;



  • Ich meinte den dort übergebenen Parameter (...), aber den habe ich jetzt in der Online-Doku von FLTK selber gefunden und, wie ich mir gedacht habe, ist das ein klassischer (d.h. auf C basierender) Funktionszeiger: callback(Fl_Callback * cb).
    Und Fl_Callback ist definiert als:

    typedef void Fl_Callback(Fl_Widget *, void *)
    

    Daher passt mein im letzten Beitrag geschriebener Code.

    Und den "user value" kannst du dann direkt bei dem Setzen des Callbacks mitgeben (durch Nutzung der überladenen Memberfunktion void Fl_Widget::callback(Fl_Callback * cb, void * p):

    durchmesser->callback(MainWindow::StaticCallback, this) // aktuelle MainWindow-Instanz (this) als UserData mitgeben
    


  • Hallo @Timo_R ,
    ein Forum hat meiner Meinung nach etwas mit zugewandter Kommunikation zu tun.
    Dieser Thread steht diesem Ansinnen diametral gegenüber.
    Ich persönlich habe dadurch an dem Inhalt kein Interesse. Die kleinen Bildausschnitte finde ich schon fast ärgerlich.
    Nichts für ungut, ist evtl. die neue Kommunikationsform unter Menschen 🤔, ne KI ist zugewandter.



  • @Timo_R sagte in Funktion aus Klasse aufrufen:

    Fehlermeldung

    Ich stelle mir auch die Frage, ob es sinnvoll sein kann, dass die Methode Callback_1(...) der Klasse MainWindow selbst wieder ein MainWindow zurückgibt.



  • ja - ich aber nur gerade an Funktionsaufrufen, Beispiel:

    void Callback_2(Fl_Widget*, void* userdata) { ... }
    

    Diese Funktion soll aus der Funktion noch einmal aufgerufen werden.

    Fehlermeldung anbei ...



  • Ausdruck zum aufrufen, müsste so oder so ähnlich aussehen...

    reinterpret_cast<void*>(&Callback_2) ....



  • @Timo_R Hast du den Link von @SeppJ gelesen? Ich tippe auf nein.

    Weil ich Montags morgens noch halbwegs gut gelaunt bin, hier nochmal das Wichtigste:
    Poste hier, einen Codeabschnitt, mit dem wir den Fehler reproduzieren können.
    Erkläre was du erwartest und was statt dessen passiert. Poste Fehlermeldungen komplett: Als Text hier rein kopiert, keinen Screenshot!



  • void Callback_2(Fl_Widget*, void* userdata) {
      	  	
      	cout << userdata << endl;
      	
      	printf("Sie befinden sich in callback 2, userdata = '%s'\n", (const char*)userdata);
     	
      	if (userdata=="start")
      	{
      	static int x = 0;
      	simulation_1->image(jpgs[x++ % TOTAL]);
      	simulation_1->redraw();
      	Fl::repeat_timeout(RATE, Callback_2); // <--- Erneuter Aufruf der Funktion funktioniert nicht
      	//      Fl::add_timeout(RATE, Callback_2);
      	printf("Simulation läuft ... \n");
      	}
    }
    

    liefert
    FEHLERMELDUNG



  • Zu spät gelesen - Fehlermeldung wird bei Bedarf nachgereicht ...



  • @Timo_R sagte in Funktion aus Klasse aufrufen:

    Probiere mal folgendes:

    void Callback_2(Fl_Widget* Widget, void* userdata) {
      	  	
      	cout << userdata << endl;
      	
      	printf("Sie befinden sich in callback 2, userdata = '%s'\n", (const char*)userdata);
     	
      	if (userdata=="start")
      	{
      	  static int x = 0;
      	  simulation_1->image(jpgs[x++ % TOTAL]);
          	  simulation_1->redraw();
      	  Fl::repeat_timeout(RATE, [&](void*) {
                 Callback_2(Widget, userdata);
              });
      	  printf("Simulation läuft ... \n");
      	}
    }
    


  • @Timo_R Die Fehlermeldung sagt, dass die Signatur die repeat_timeout für die Callback Funktion erwartet nicht zu Callback_2 passt.

    Ich kenne das Framework, welches du da benutzt jetzt nicht, aber mich wundert gerade etwas, das Callback_2 sich selbst als Callback übergibt.



  • @ QUICHE LORRAINE:
    liefert

    Wie baue ich mir solch einen Ausdruck auf?


Anmelden zum Antworten