Funktion aus Klasse aufrufen



  • 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?



  • Wenn du das mit der Lambda-Funktion nicht hinbekommst, dann erzeuge eine benannte Funktion vom passenden Typ (den ersten Parameter Fl_Widget* benutzt du ja nicht und der 2. hat ja den passenden Typ void*) und rufe diese dann auf (das was ich oben schon bei der statischen Funktion gemacht habe).

    PS: Überlege noch mal den Vergleich bei (userdata=="start") - hier findet nur ein Adressvergleich statt, kein Stringvergleich.
    Es kommt dann drauf an, ob der Compiler die Stringliterale optimiert, s. unterschiedliche Ergebnisse bei MSVC v19.latest und gcc 14.2: C++ Compiler Explorer Code.


Anmelden zum Antworten