matriz de punteros a funciones

Necesito escribir una función que reciba una serie de punteros a funciones. Escribí el siguiente código, sin embargo, estoy teniendo problemas para probarlo en este momento.

¿Es esta la forma correcta de definir un puntero a la matriz de funciones?

typedef (*Function)(double); void func(Function* arr); 

y si quiero declarar el tamaño de la matriz con [20], escribo:

 void func(Function arr[20]); 

?

gracias por tu ayuda

En primer lugar, mi método habitual para averiguar tipos complejos. Comience con el identificador y luego agregue el rest paso a paso:

  f -- f f[N] -- is an N-element array *f[N] -- of pointers (*f[N])() -- to functions T (*f[N])() -- returning T 

Para una matriz de punteros a funciones que toman un doble parámetro y devuelven un doble valor, eso sería

 double (*f[N])(double); 

Sin embargo, recuerde que las expresiones del tipo de matriz “decaimiento” del tipo “matriz de elementos N de T” al “puntero a T” en la mayoría de los contextos. Cuando pasa una expresión de matriz como un argumento a una función, lo que realmente recibe la función es un puntero. Por lo tanto, en lugar de recibir un objeto de tipo “matriz de elemento N de puntero a función que devuelve doble”, su función recibirá un objeto de tipo “puntero a puntero a función que devuelve doble”, o

 double (**f)(double) 

Así que su definición de función se vería algo así como

 void func(double (**f)(double)) { int i; ... for (i = 0; f[i] != NULL; i++) { double x = (*f[i])((double) i); } } 

Y la persona que llama se vería algo así como

 double a(double x) {...} double b(double x) {...} double c(double x) {...} void foo(void) { double (*list[])(double) = {a, b, c, NULL}; func(list); } 

Si quieres usar typedefs en su lugar, podrías usar algo como esto:

 typedef double Dblfunc(double); // typedef for function type typedef Dblfunc *Dblfuncptr; // typedef for function pointer type void func(Dblfuncptr *f) { int i; for (i = 0; f[i] != NULL; i++) { double x = (*f[i])((double) i); ... } } ... void foo(void) { Dblfuncptr list[] = {a, b, c, NULL}; // EDIT: fixed type func(list); } 

El uso de typedefs hace que los parámetros de matriz y función se vean más como tipos normales. Personalmente, prefiero usar los tipos “sin procesar”, ya que muestra explícitamente que estoy tratando con punteros a funciones, y muestra cuáles son los tipos de parámetros y de retorno.

Si corrige typedef para incluir un tipo de retorno typedef void (*Function)(double); , esa statement de matriz funcionará bien. Lo llamaría llamando al (arr[index])(3.14) para el caso de la matriz.

BTW: http://www.newty.de/fpt/fpt.html es una referencia útil para los punteros de función.

¿Qué devuelve la función? Eres el tipo de retorno en el puntero de función typedef, como si tuvieras algo como

 typedef double (*Function)(double); 

parece casi correcto, creo que olvidó el tipo de retorno al declarar la Función:

 typedef int (*Function)(double) 

en lugar

La segunda statement no es válida también, creo que no es válido para especificar el tamaño de la matriz para los parámetros de la función

 void func (Function*) 

lo hará bien