mikrocontroller.net

Forum: Compiler & IDEs Funktionspointer


Autor: TechInfo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

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


int main (void) {
[...]

XUartLite UartLite;
void* CallBackRef;
XUartLite_Handler (*Callback)(void);
Callback=RecvCallback;
XUartLite_SetRecvHandler (&UartLite, *Callback, CallBackRef); 

[...]
}


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:
typedef void (*XUartLite_Handler)(void *CallBackRef, unsigned int ByteCount);

  

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.