Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: David8 en 5 Abril 2014, 20:26 pm



Título: ¿Ventajas de un puntero a una función?
Publicado por: David8 en 5 Abril 2014, 20:26 pm
Pues eso, quería saber cual es la ventaja de usar una función con una llamada normal, por ejemplo funcion(10) a hacerlo con un puntero a una función, por ejemplo ( siendo la decalaración void (*ptrF) (int x); )  x=ptrF(10)


Título: Re: ¿Ventajas de un puntero a una función?
Publicado por: amchacon en 5 Abril 2014, 20:46 pm
Pues que puedes crear una función que llame a otra función que no sabes ni como es ;D

Suponte que yo hago una librería para trabajar con imagenes BMP. Mi librería es capaz de leer un archivo bmp, descodificarlo y coger los datos de la imagen.

Pintarla es un tema que depende de la librería gráfica que se use en el momento. Como quiero que sea general me hago una función pintartal que así:

Código
  1. void pintar(void (*ptrF) (int) ptrf);

El usuario que use mi librería, puede pintar la imagen con esta función independientemente de la plataforma y de la librería gráfica que use. Solo necesita que pasar la función que él usa para pintar un pixel en la pantalla.


Título: Re: ¿Ventajas de un puntero a una función?
Publicado por: ivancea96 en 5 Abril 2014, 20:51 pm
No es que tenga unas "ventajas" determinadas, sinó que tiene otros usos, y abre otras posibilidades.

Palabras del profesor Oak: "Usa cada cosa en su momento." :D


Título: Re: ¿Ventajas de un puntero a una función?
Publicado por: David8 en 6 Abril 2014, 12:47 pm
Pues que puedes crear una función que llame a otra función que no sabes ni como es ;D

Suponte que yo hago una librería para trabajar con imagenes BMP. Mi librería es capaz de leer un archivo bmp, descodificarlo y coger los datos de la imagen.

Pintarla es un tema que depende de la librería gráfica que se use en el momento. Como quiero que sea general me hago una función pintartal que así:

Código
  1. void pintar(void (*ptrF) (int) ptrf);

El usuario que use mi librería, puede pintar la imagen con esta función independientemente de la plataforma y de la librería gráfica que use. Solo necesita que pasar la función que él usa para pintar un pixel en la pantalla.

Muchas gracias. Tendré que investigar más sobre el tema.
Una última cosa, ¿una llamada a una función con un puntero a función es más rápida que una llamada "normal"?


Título: Re: ¿Ventajas de un puntero a una función?
Publicado por: amchacon en 6 Abril 2014, 12:59 pm
No.


Título: Re: ¿Ventajas de un puntero a una función?
Publicado por: ivancea96 en 6 Abril 2014, 13:10 pm
Un ejemplo de uso:
Código
  1. void himno();
  2. void pacman();
  3. void tetris();
  4.  
  5. int main(int args, char **argc){
  6.    void (*funcs[])()={himno,pacman,tetris}; //Arreglo de funciones
  7.    cout << "Qué cancion deseas escuchar?" << endl;
  8.    cout << "1: Himno" << endl;
  9.    cout << "2: Pacman" << endl;
  10.    cout << "3: Tetris" << endl;
  11.    string t;
  12.    cin >> t;
  13.    cout << endl;
  14.    if(t.size()==0) t='1'; //Evitar problemas en entrada
  15.  
  16.    funcs[(t[0]-'1')%3](); //Llamamos a la función. "(t[0]-'1')%3" es solo para evitar que salga del rango 0-2
  17.  
  18.    return 0;
  19. }


Título: Re: ¿Ventajas de un puntero a una función?
Publicado por: amchacon en 6 Abril 2014, 13:17 pm
¿Por que lees un string y no un entero?


Título: Re: ¿Ventajas de un puntero a una función?
Publicado por: ivancea96 en 6 Abril 2014, 13:31 pm
Para evitar errores.


Título: Re: ¿Ventajas de un puntero a una función?
Publicado por: amchacon en 6 Abril 2014, 13:35 pm
Para eso tienes cin.good()


Título: Re: ¿Ventajas de un puntero a una función?
Publicado por: ivancea96 en 6 Abril 2014, 13:35 pm
Pero con string lo hago más rápido C:


Título: Re: ¿Ventajas de un puntero a una función?
Publicado por: amchacon en 6 Abril 2014, 14:39 pm
Al reves, un string tiene que redimensionarse dinámicamente.

Ademas, desde cuando te importa la eficiencia?  ;D


Título: Re:
Publicado por: ivancea96 en 6 Abril 2014, 15:21 pm
He dicho que lo hago más rápido, no que sea más eficiente.
Además, en este ejemplo la eficiencia es absurda e innecesaria.

Enviado desde mi ST21i mediante Tapatalk


Título: Re:
Publicado por: amchacon en 6 Abril 2014, 17:20 pm
He dicho que lo hago más rápido, no que sea más eficiente.
Además, en este ejemplo la eficiencia es absurda e innecesaria.

Enviado desde mi ST21i mediante Tapatalk
Estas comparando:

Código
  1. string t;
  2. cin >> t;
  3. if(t.size()==0) t='1'; //Evitar problemas en entrada
  4.  
  5. funcs[(t[0]-'1')%3](); //Llamamos a la función. "(t[0]-'1')%3" es solo para evitar que salga del rango 0-2

¿Con esto?
 
Código
  1. int N;
  2. cin>>N;
  3.  
  4. if (cin.good())
  5.    funcs(N%3);

Yo veo más corto el segundo, pero sobre gustos no hay nada escrito :-X


Título: Re: ¿Ventajas de un puntero a una función?
Publicado por: ivancea96 en 6 Abril 2014, 17:46 pm
el el segundo habría que hacer un while y comparar hasta que la entrada sea correcta.
Y por cierto, ese no era el tema del post.


Título: Re: ¿Ventajas de un puntero a una función?
Publicado por: rir3760 en 6 Abril 2014, 18:21 pm
¿una llamada a una función con un puntero a función es más rápida que una llamada "normal"?
En el caso de C (habrá que revisar los puntos finos de C++) no hay diferencia ya que una llamada a función requiere de un puntero, cuando se llama a una función utilizando su identificador o una expresión que la denote (identifique, haga referencia) ello genera el puntero necesario.

Un ejemplo sencillo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int (*p)(const char *) = puts;
  7.  
  8.   p("puntero");
  9.   puts("identificador ==> puntero");
  10.   (*p)("expresion ==> puntero");
  11.  
  12.   return EXIT_SUCCESS;
  13. }

----

el segundo habría que hacer un while y comparar hasta que la entrada sea correcta.
En ambos. Pero como se trata de ejemplos ilustrativos no veo porque molestarse con validaciones (la idea es explicar otra parte del lenguaje, ya se agregaran cuando sean necesarias).

Un saludo