Mein Compiler gibt mir ../menu.c:13: warning: assignment from incompatible pointer type aus. Aber dieser: unsigned char (*start)(void) und dieser: unsigned char (*function_ptr)(unsigned char event) Poniter sind doch nicht incompatibel. Was will er von mir ich Blick nicht ganz durch.
Henning schrieb: > Mein Compiler gibt mir > ../menu.c:13: warning: assignment from incompatible pointer type > aus. > > Aber dieser: > > unsigned char (*start)(void) > > und dieser: > > unsigned char (*function_ptr)(unsigned char event) > > Poniter sind doch nicht incompatibel. Doch das sind sie. Die Funktionen auf die sie zeigen haben unterschiedliche Argumentlisten. Der eine zeigt auf eine Funktion die keine Argumente nimmt, der andere auf eine Funktion die einen unsigned char haben will.
Ja aber es geht trotzdem. Kann das irgend welche Probleme geben oder kann ich da mal drüber hinweg sehen.
Hängt in weiten Teilen von der Umsetzung des Compilers ab. Warum behebst du das Problem nicht einfach?
Und wenn ich anstelle von void z.b. uint8 event; einsetze gibts keine warining mehr sondern ein error. Wie bekomm ich das also weg, wie löse ich das?
Welchen 'error' gibts denn? Das Problem löst du, indem du die Typen anpasst... (frag dich mal selber, was jemand dir jetzt antworten sollte..)
Das Problem sollte doch gelöst sein wenn beide gleich sind also: unsigned char (*start)(unsigned char event) unsigned char (*function_ptr)(unsigned char event); ODER?
Also erstmal fehlt da ein ; Dann: Wenn du jetzt den Typen einfach in der Dekltartion änderst, taucht der Fehler evtl. an einer anderen Stelle auf. Sprich, wo kamen die unterschiedlichen Typen ursprünglich her. Hast du an diesem Punkt nun Typenprobleme?
Du meinst da wo ich die benutzte ob ich da jetzt Probleme damit habe: JA. Und zwar hier mit start_function(show_temperature); main.c:48: warning: passing argument 1 of 'start_function' from incompatible pointer type
Mann! Zeig doch endlich den verdammten Quelltext her. Ist doch so schwer nich zu verstehn.
void start_function(unsigned char (*start)(unsigned char event)) { function_ptr = start; } void execute_event(unsigned char event) { (*function_ptr)(event); }
Henning schrieb: > void start_function(unsigned char (*start)(unsigned char event)) > { > function_ptr = start; > } > > void execute_event(unsigned char event) > { > (*function_ptr)(event); > } Das gibt des Fehler
1 | error: `function_ptr' undeclared (first use in this function) |
Du musst function_ptr definieren, so geht das nicht. Der Compiler braucht zumindest eine Deklaration dafür. Eine korrekte Deklaration sieht zB so aus:
1 | extern unsigned char (*function_ptr) (unsigned char); |
2 | |
3 | void start_function (unsigned char (*start)(unsigned char)) |
4 | {
|
5 | function_ptr = start; |
6 | }
|
7 | |
8 | void execute_event (unsigned char event) |
9 | {
|
10 | function_ptr (event); |
11 | }
|
Johann
Henning schrieb: > void start_function(unsigned char (*start)(unsigned char event)) > { > > function_ptr = start; > > } > > > > void execute_event(unsigned char event) > { > > (*function_ptr)(event); > > } und wo ist da jetzt das incompatible Assignment? Zeig doch bitte kompletten Code! So schwer ist das nicht. Da gehören auch Datentypen dazu! Ein Tip: Bei der Arbeit mit Funktionspointern ist ein typedef meistens eine extrem gute Idee
1 | typedef unsigned char (*CallbackFunc)( unsigned char ); |
2 | |
3 | CallbackFunc function_ptr; |
4 | |
5 | void start_function( CallbackFunc start ) |
6 | {
|
7 | function_ptr = start; |
8 | }
|
9 | |
10 | void execute_event(unsigned char event) |
11 | {
|
12 | (*function_ptr)(event); |
13 | }
|
14 | |
15 | unsigned char foo( unsigned char event ) |
16 | {
|
17 | return 0; |
18 | }
|
19 | |
20 | int main() |
21 | {
|
22 | start_function( foo ); |
23 | execute_event( 1 ); |
24 | }
|
unsigned char (*function_ptr)(unsigned char event); ist in der header datei deklariert. Ich rufe in main das so auf int main(void) { start_function(show_all); for(;;) { execute_event(event); } } Und das ist show_all: void show_all(unsigned char input) { uart_puts("Hallo"); } Mein Fehler lautet main.c:48: warning: passing argument 1 of 'start_function' from incompatible pointer type
Henning schrieb: > Du meinst da wo ich die benutzte ob ich da jetzt Probleme damit habe: > JA. > > Und zwar hier mit > start_function(show_temperature); > > main.c:48: warning: passing argument 1 of 'start_function' from > incompatible pointer type Da wird dann show_temperature nicht die signatur haben, die des Funktionspointer-Argument zu start_function haben will. Sprich show_temperature wird nicht so aussehen
1 | unsigned char show_temperature( unsigned char event ) |
2 | {
|
3 | }
|
Die Funktion muss schon von der Gestalt sein, die der Funktionspointer vorschreibt. Wie soll denn sonst der Compiler die Argumente über den Funktionspointer durchschleifen bzw. den Returnwert abholen, wenn das nicht zusammenstimmt?
Henning schrieb: > unsigned char (*function_ptr)(unsigned char event); function_ptr ist ein Pointer auf eine Funktion. Diese Funktion übernimmt einen unsigned char und sie liefert einen unsigned char als Returnwert. > Und das ist show_all: > > void show_all(unsigned char input) Diese Funktion übernimmt zwar einen unsigned char, aber sie liefert keinen Return Wert. Ergo passt diese Funktion nicht zu der Signatur, die der Funktionspointer vorschreibt. Denn der Funktionspointer sagt explizit, dass die Funktion einen unsigned char liefern muss.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.