Funktionszeiger als Parameter?
-
Hallo ich weiß nicht wo im folgenden Quelltext der Fehler ist.
#include <stdio.h> #include <string.h> void times(int a, void (*ptr)(char* var)); void times(int a, void (*ptr) (char* var)){ int i; for(i=0;i<a;i++){ ptr; } } void print(char* val){ int a = strlen(val); int i; for(i=0; i<a; i++){ printf("%c",val[i]); } printf("\n"); } int main(void){ times(5,print("Hallo")); //print("Hallo"); return 0; }
Fehlermeldung ist: 24: error: invalid use of void expression
Kann mir da jemand weiter helfen?
-
machst du so:
void times (int a, void (*ptr)(char*), char *var) { int i; for(i=0;i<a;i++) { ptr (var); } }
und aufrufen dann:
times (5, print, "hallo");
-
Vielen Dank.
-
Nimm da bitte nen Typedef. Funktionspointer ohne Typedefs sind für jeden, der deinen Code lesen muss, ein Graus.
typedef void (my_func_ptr)(char *var); void times(int a, my_func_ptr *ptr, char *var);
-
Nur für den, der keine Deklarationen lesen kann. Ein Graus ist eher so ein falsch benannter typedef wie bei dir (dein Typ my_func_ptr ist kein Funktionspointer, sondern eine Funktion). Und wozu du Klammern um my_func_ptr setzt bleibt auch ein Rätsel. Riecht insgesamt nach einer Unsicherheit in der Syntax und Semantik von C. Das ist an sich keine Schande, aber da musst du an dir selbst arbeiten und nicht anderen Vorschriften machen.
-
Ich achte wenn ich in der Uni schnell nen Forenpost schreib sicherlich nicht darauf wie ich nen Datentyp nennen wenn es nicht um den Namen geht.
Und spätestens wenn man zu dem Pointer casten will wird das ohne Typedef richtig spaßig und lesbar!Und wenn du mal nach "C function pointer" googest findest du haufenweise Code, wo der Name in Klammern geschrieben ist.
Letzendlich zum "ist kein Funktionsptr sondern eine Funktion": Macht IMHO mehr Sinn, "my_func_ptr *****func;" beim Deklarieren zu benutzen statt das im typedef zu machen.
-
Und wenn du mal nach "C function pointer" googest findest du haufenweise Code, wo der Name in Klammern geschrieben ist.
Aber nur damit der Stern auch dem Funktionszeiger zugeordnet werden kann, und nicht dem Ergebnis.
Letzendlich zum "ist kein Funktionsptr sondern eine Funktion": Macht IMHO mehr Sinn, "my_func_ptr *func;" beim Deklarieren zu benutzen statt das im typedef zu machen.
Wenn Raserei zu Staub zersprengt den Stein? Ein * auf einen my_func_ptr halte ich ganz naiv für einen Zeiger auf einen Zeiger.