2

Click here to load reader

Ejemplo de paso de funciones como parámetros a otra función

Embed Size (px)

DESCRIPTION

Ejemplo en C++ de paso de una función a otra función

Citation preview

Page 1: Ejemplo de paso de funciones como parámetros a otra función

EJEMPLO DE PASO DE FUNCIONES COMO PARÁMETROS A OTRA FUNCIÓN

#include <iostream>

#include <conio.h>

char auxa(int posicion); // prototipo de auxa

void escribe (int posicion, char (* ptr)(int) ); // L.5: prototipo de escribe

int main() { // ======================

char (* fptr) (int); // M.1: declara fptr puntero-a-función

fptr = auxa; // M.2: inicia fptr

cout<<"La letra ”<<5<<” es una: “<< auxa(5)<<endl;

escribe (5, fptr); // M.4: llamada a escribe

return (0);

}

char auxa (int num) { // Definición de auxa

char * str = "Hola mundo";

return str[num]; // L.16

}

void escribe (int pos, char (* fpointer)(int) ) { // definición de escribe

char ch ;

printf ("Estoy recibiendo la letra: %c\n", auxa(pos));

ch = (* fpointer)(6);

printf ("Estoy inventando la letra: %c\n", ch);

}

Salida:

La letra 5 es una: m

Estoy recibiendo la letra: m

Estoy inventando la letra: u

Comentario:

La función auxa recibe un entero y devuelve un carácter. El puntero str a la matriz de

caracteres "Hola mundo" es una variable local de esta función. El lector observador,

percibirá que el carácter devuelto en L.16, se obtiene utilizando una notación de puntero

con subíndice, algo extraño a la luz de la expuesto hasta ahora. En realidad también

podríamos haber puesto:

return *(str+num); // L.16-bis

Al tratar de las matrices justificaremos la notación de subíndices más compacta. Por el

momento el lector puede aceptar la que le resulte más cómoda. También observar que

Page 2: Ejemplo de paso de funciones como parámetros a otra función

en este caso hemos suprimido el paréntesis en el valor devuelto por no ser realmente

necesario.

return (str[num]) == return str[num]

La función escribe recibe dos parámetros: un entero, y un puntero-a-función aceptando

un entero y devolviendo un carácter. Su prototipo está en L.5, y su definición en L.18.

Observe que esta función proporciona dos salidas. La primera de ellas es una invocación

a cout parecida a la realizada en M.3, en la que el segundo argumento es también el

resultado de una invocación directa a auxa.

La segunda se realiza también mediante un cout, pero en este caso, se utiliza

directamente un char como segundo argumento, que es proporcionado por la variable

local ch. El punto interesante aquí es que su valor se ha obtenido mediante una

invocación a auxa a través de un puntero.

El programa comienza declarando fptr, un puntero-a-función que acepta un entero y

devuelve un char (M.1). A continuación se inicia de forma que señale a la función auxa

(que cumple con las condiciones exigidas por el puntero).

En M.3 se escribe la primera salida. Observe que el tercer argumento de cout es el

valor devuelto por una invocación a auxa pasándole un 5 como argumento. En este

contexto las sentencias

auxa(n);

(* fpointer)(n);

fpointer(n);

son equivalentes.

En M.4 se realiza una invocación a escribe utilizando como segundo argumento es el

puntero fptr definido en las líneas anteriores. Esta invocación es responsable de la

segunda y tercera salidas.