void(*func) -> Selector definieren

  • void(*func) -> Selector definieren

    Hi,

    Ich hab zu diesem Thema leider nichts in meinem C-Buch gefunden, also post ich's hier mal:
    In GLUT kann man ja mit z.B. glutDisplayFunc( FUKNTIONSNAME ) GLUT sagen, welche Funktion es aufrufen soll, wenn der Bildschirm neu gezeichnet wurde, also so in etwa:

    Quellcode

    1. ...
    2. glutDisplayFunc( renderScene );
    3. }
    4. void renderScene()
    5. {
    6. //Zeichnen


    Die header-Definition für die glutDisplayFunc() Methode schaut folgendermassen aus:

    Quellcode

    1. void glutDisplayFunc (void (*func)(void))


    Wenn ich mir jetzt selbst so eine Funktion für mein Framework schreiben möchte, mit der ich z.B. eine render-Funktion festlegen kann (e.g. meineDisplayFunc( renderScene ); ), wie muss ich das machen? Also was ist "void (*func)(void)" für eine Art von Variable und wie kann ich schlussendlich die Funktion, die ich so erhalten habe, aufrufen?

    Vielen Dank und liebe Grüsse aus Zürich,
    Fabian
  • RE: void(*func) -> Selector definieren

    Das ist en sogenannter Funktionszeiger, nicht Methodenzeiger.

    Du kannst ihm einen Wert zuweisen, indem du einfach den Funktionsnamen ohne Klammern nimmst.

    Quellcode

    1. // Ein Funktionszeiger:
    2. (void)(*func)(void)
    3. // Eine Funktion
    4. (void)function();
    5. // Eine Zuweisung an den Zeiger
    6. func = Funktion;
    7. // Übergabe als Parameter
    8. glutDisplayFunc( Funktion );
    Alles anzeigen


    In C++ und objC kann man das nicht so ohne Weiteres mit Methoden machen. Der Grund ist das late Binding. Der Compiler kann nicht wissen, welche Methode er nehmen soll. In objC entspricht in etwa der Datentyp IMP dem Funktionszeiger, den man allerdngs nicht verwenden sollte. Stattdessen werden verweise auf Methoden mittels SEL vorgenommen. Das sähe also in etwa wie folgt aus:

    Quellcode

    1. [glutDisplayMethod doSomethingWithRenderer:myRenderer andSelector:@selector(myRenderingMethod)];
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Hmmm, wenn ich die funktion

    Quellcode

    1. void xglInitLoadingScreenFunc(void(*func)(void))
    2. {
    3. prepareLoadingScreen = func;
    4. }


    ...von der main.m datei meines programms aufrufe (xglInit funktion liegt in einer anderen .c datei) bekomm ich immer nen EXC_Bad_ACCESS fehler, warum das?

    Definition von prepareLoadingScreen (im header der .c datei):

    Quellcode

    1. void(*prepareLoadingScreen)(void);


    Warum funktioniert das nicht? Jemand ne idee?

    Grüsse,
    Fabian