Forum: Compiler & IDEs Funktionspointer


von TechInfo (Gast)


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);

  

von Karl H. (kbuchegg)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.