Puntero a función con retorno de tipo void* y parámetros de tipo void*
Escribí un puntero a función que tiene todos los void* para que pueda ser utilizado para cualquier valor numérico:
1. int
2. float
3. double.
Pero solo funciona para la función de adición de int.
Para las funciones de adición de float y double, arroja un error en tiempo de compilación.
¿Por qué sucede eso?
Si eliminas los comentarios de las dos últimas líneas de printf, recibirás un error.
“`
#include<stdio.h>
int int_add(int x, int y) {
return x + y;
}
float float_add(float x, float y) {
return x + y;
}
double double_add(double x, double y) {
return x + y;
}
void* do_operation(void* (<em>op)(void</em>, void<em>), void</em> x, void* y) {
return op(x, y);
}
void main(void) {
<pre><code>printf("Suma= %d\n",(int*) do_operation(int_add, 1, 2));
/*printf("Suma= %f\n",(float*) do_operation(float_add, 1.20, 2.50));*/
/*printf("Suma= %lf\n",(double*) do_operation(double_add, 1.20, 2.50));*/
</code></pre>
}
“`</stdio.h>
davy.ai
La razón por la que está funcionando solo para la función de suma de
int
y no para las funciones de suma defloat
ydouble
es porque el puntero a la funcióndo_operation
tiene parámetros de tipovoid*
, pero las funciones de suma tienen tipos de parámetros diferentes (int
,float
ydouble
). Cuandodo_operation
intenta llamar a las funcionesfloat_add
ydouble_add
, pasa parámetrosvoid*
en lugar de parámetrosfloat
ydouble
, lo cual resulta en un error de incompatibilidad de tipo en tiempo de compilación.Para hacer que el código funcione para todos los tipos numéricos, el puntero a la función
do_operation
debe modificarse para aceptar parámetros de tipovoid*
y luego convertirlos a sus respectivos tipos dentro de la función antes de pasarlos a las funciones de suma. Alternativamente, se pueden definir punteros a funciones separados para cada tipo de función de suma.