Funktionspointer definieren!?



  • hi,

    es geht um folgende Deklaration:

    static VOID (WINAPI * TrueSleep)(DWORD dwMilliseconds) = Sleep;
    

    kann die evt. jemand kurz erklären?
    Was hat der Pointer-stern hier für eine Funktion? WINAPI zeigt auf TrueSleep?

    Ich finde eher folgende Deklaration logischer:

    static VOID (WINAPI TrueSleep(DWORD dwMilliseconds)) = Sleep;
    


  • Und warum funktioniert dann:

    static VOID (WINAPI * TrueTextOut)( HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString ) = TexOut;
    

    nicht? windows.h sind included!



  • Progra12 schrieb:

    Und warum funktioniert dann:

    static VOID (WINAPI * TrueTextOut)( HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString ) = TexOut;
    

    nicht? windows.h sind included!

    a) Sagt der Compiler mehr als "tut nich" ?
    b) Heißt die Funktion wirklich "TexOut" (Solltest sonst mal LaTexOut versuchen) 😉

    Gruß,

    Simon2.



  • Progra12 schrieb:

    hi,

    es geht um folgende Deklaration:

    static VOID (WINAPI * TrueSleep)(DWORD dwMilliseconds) = Sleep;
    

    kann die evt. jemand kurz erklären?
    Was hat der Pointer-stern hier für eine Funktion? WINAPI zeigt auf TrueSleep?

    Ich finde eher folgende Deklaration logischer:

    static VOID (WINAPI TrueSleep(DWORD dwMilliseconds)) = Sleep;
    

    "So sind nunmal die bekackten Regeln" (Big Lebowski)
    Der "*" ist nunmal das "Pointerkennzeichen" in C/C++.

    static VOID (WINAPI * TrueSleep)(DWORD dwMilliseconds) = Sleep;
    

    Ein Funktionspointer wird definiert

    Qualifier Returntype (*Funktionsname)(Argumentliste);
    // z.B.
    int (*f)(int a);
    static void (*p)(void);
    // Folgendes ist kein F-Pointer, sondern ein F-Prototyp mit Returntyp "Pointer auf int":
    int *f(int a);
    

    Genau DEM entspricht Dein Beispiel.
    ("WINAPI" Wird in Deinem Fall ein #define auf irgendeinen Pointerqualifier o.ä. sein (kenn' ich nicht)).

    Mit

    ...= Sleep;
    // wird dem Funktionspointer ein Wert zugewiesen 
    // (sprich: er zeigt jetzt auf die Funktion namens "Sleep".
    // Eigentlich nichts Anderes als:
    int i = 1;
    

    Gruß,

    Simon2.



  • Progra12 schrieb:

    static VOID (WINAPI * TrueSleep)(DWORD dwMilliseconds) = Sleep;
    

    kann die evt. jemand kurz erklären?

    Ich könnte vielleicht, wenn ich wüsste, was genau du wissen willst. Ich mein, wenn du nicht wüsstest, wie man Funktionszeiger deklariert, hättest du nicht ausgerechnet ein Winapi-Beispiel gepostet. Hättest du andererseits speziell Probleme mit der Winap-Syntax, hättest du auch im Winapi-Forum gepostet. Da spar ich mir doch erstmal lange Erklärungen ...

    Was hat der Pointer-stern hier für eine Funktion? WINAPI zeigt auf TrueSleep?

    Er zeigt an, dass TrueSleep ein Pointer ist. Das "WINAPI" ist vermutlich ein #define auf irgendwas Compilerspezifisches. Lt. Standardsyntax darf an der Stelle nichts stehen, AFAIK.

    Ich finde eher folgende Deklaration logischer:

    static VOID (WINAPI TrueSleep(DWORD dwMilliseconds)) = Sleep;
    

    Mag sein, dass du es logischer findest, aber Funktionen kann man halt keine anderen Funktionen zuweisen. Dafür gibts ja gerade Funktionspointer.



  • WINAPI ist eine Calling Convention oder wie das heisst. Wird IIRC nach __stdcall aufgelöst.



  • 1310-Logik schrieb:

    ...Calling Convention ...

    DAS war der Ausdruck, den ich gesucht habe !

    Danke, vielleicht merke ich mir den bis zum nächsten Mal 😉

    Gruß,

    Simon2.


Log in to reply