Funktionspointer

Gast #543448
Lesenswert?

Hallo,

ich möchte folgende Funktion aufrufen:
1
void XUartLite_SetRecvHandler(XUartLite *InstancePtr, XUartLite_Handler FuncPtr, void *CallBackRef);

Das ist mein Programm:
1
XUartLite_Handler RecvCallback(void); //Prototyp
2

3

4
int main (void) {
5
[...]
6

7
XUartLite UartLite;
8
void* CallBackRef;
9
XUartLite_Handler (*Callback)(void);
10
Callback=RecvCallback;
11
XUartLite_SetRecvHandler (&UartLite, *Callback, CallBackRef); 
12

13
[...]
14
}

Es kommt die Warnung:

warning: passing arg 2 of `XUartLite_SetRecvHandler' from incompatible 
pointer type

Wo ist mein Fehler?

Das hab ich noch in der betreffenden Header-Datei gefunden:
1
typedef void (*XUartLite_Handler)(void *CallBackRef, unsigned int ByteCount);

  
#543464
Lesenswert?

TechInfo wrote:

> void* CallBackRef;
> XUartLite_Handler (*Callback)(void);

Ein XUartLiteHandler ist bereits ein Funktionspointer.
Daher denke ich, dass es heissen müsste:

  XUartLite_Handler Callback;

So wie du das jetzt hast, definierst du Callback
als Pointer auf eine Funktion, die keine Argumente liefert
und einen XUartLite_Handler zurückliefert.

> Callback=RecvCallback;
> XUartLite_SetRecvHandler (&UartLite, *Callback, CallBackRef);
>

Dein Code Schnipsel ist sehr kurz, sodass ich die
Absicht dahinter nicht zweifelsfrei erkennen kann.

> warning: passing arg 2 of `XUartLite_SetRecvHandler' from incompatible
> pointer type

Ja. das ist klar.
XUartLite_SetRecvHandler möchte einen Pointer auf eine
XUartLite_Handler Funktion. Du gibst ihr aber einen Pointer
auf eine Funktion die so einen XUartLite_Handler liefern könnte.

Den * in
XUartLite_SetRecvHandler (&UartLite, *Callback, CallBackRef);
wird der Compiler wohl ignorieren, da er hier keinen Sinn
ergibt. Einen Funktionspointer kann man so nicht dereferenzieren.
Das könnte man nur, indem man die Funktion tatsächlich aufruft.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren