Zeiger auf Funktionen



  • Hi

    Ich will einen Zeiger auf eine Funktion, welche einen beliebigen Rückgabewert hat und keine Parameter benötigt. Wie sieht der aus?

    void (Func*)(void);
    

    ?
    Und macht man eine __property davon?



  • Hallo

    Nein die Syntax ist nicht korrekt. So ist es richtig :

    void (*Func)(void);
    

    Natürlich ist der Rückgabetyp niemals beliebig, sondern durch void sogar gar nicht vorhanden.

    Wie du VCL-Events definierst kannst du hier nachlesen.

    bis bald
    akari



  • Hi

    akari schrieb:

    Natürlich ist der Rückgabetyp niemals beliebig,...

    Soll das heissen, ich kann keine Zeiger auf Funktionen definieren kann, welche nicht den selben Rückgabewert haben?
    __property ist auch in Nicht-VCL-Klassen verfügbar! Und ich will den Zeiger nicht DYNAMIC haben (also nicht bei einem Mausklick oder so)!
    In dem Typ Windowclass kann (oder muss) man auch Funktionen als Parameter von anderen Funktionen angeben.
    Kennst du glut? Dort kann man mit glutDisplayFunc eine Funktion angeben.



  • Hallo

    Soll das heissen, ich kann keine Zeiger auf Funktionen definieren kann, welche nicht den selben Rückgabewert haben?

    😕 Alles was ich damit sagen wollte ist, das du bei jedem Funktionszeiger-Prototyp zur Entwurfszeit immer genau einen gültigen Rückgabetyp (oder void) angeben mußt. Der Datentyp des Funktionszeigers muß exakt zum Prototyp der Funktion passen, die du damit verwalten willst.

    __property ist auch in Nicht-VCL-Klassen verfügbar!

    Ja

    Und ich will den Zeiger nicht DYNAMIC haben (also nicht bei einem Mausklick oder so)!

    Damit meinst du wahrscheinlich, das du keinen VCL GUI-Event haben willst. Das ist kein Problem.

    In dem Typ Windowclass kann (oder muss) man auch Funktionen als Parameter von anderen Funktionen angeben.
    Kennst du glut? Dort kann man mit glutDisplayFunc eine Funktion angeben.

    Ja, nennt man Callback-Funktionen. Das ist ein wichtiger Anwenungdszweck von Funktionszeigern. Dann solltest du in der Tat die VCL-Events vergessen. Lies dir lieber das hier durch

    Andererseits weiß ich jetzt auch nicht, was dein eigentliches Problem ist?

    bis bald
    akari



  • Vielen Dank! 👍
    Der zweite Link war super!

    akari schrieb:

    immer genau einen gültigen Rückgabetyp (oder void) angeben mußt.

    Kann man sich da nicht durchmogeln?

    void* (Func*)(...);
    

    Die Frage war eigentlich nur wegen dem Rückgabewert, aber so habe ich mich auch noch mit Wissen über Anderes der Funktionszeiger bedient.



  • Klar kannst du auch void-Pointer zurückgeben. Bevor du damit aber was anfangen kannst mußt du diesen aber wieder auf den Ursprungstyp casten. Dazu mußt du aber wissen, welches der Ursprungstyp ist. Das wiederum macht das Ganze etwas unhandlich.
    Als C++ Lösung bietet sich hier eher die Rückgabe einer (evtl. abstrakten) Basisklasse an. Dann kann man schön auch Polymorphie nutzen.



  • Hallo

    Callback-Funktionen verwenden in der Tat oft einen void-Zeiger für Datenübergabe. Aber nur für die Paydata. Also eine zusätzliche Markierung des Aufrufers der Prozeßfunktion, mit der die Prozeßfunktion nichts anderes macht als über die Callback-Funktion wieder an den Aufrufer zurückgegeben. Dieser kann dann den Zeiger wieder ursprünglichen Datentyp zurückcasten. Damit wird meistens eine Objektinstanz durchgeschleift, um den Prozeßaufruf zu der passenden Umgebung zuzuordnen. Schließlich muß die Callbackfunktion in C-Schnittstellen eine statische Funktion sein, und kann nicht die nichtstatische Memberfunktion einer Klasse sein.
    Im Normalfall wird so eine Paydata aber als Parameter und nicht als Rückgabetyp behandelt. Der Rückgabetyp einer Callbackfunktion ist meistens void (ohne Zeiger) oder bool (z.B. wenn man in der Callback-Methode die Möglichkeit haben soll, die Prozeßfunktion vorzeitig beenden zu können)

    bis bald
    akari


Log in to reply