[C con Clase] tipo estructurado algo complejo

Steven Davidson srd4121 en njit.edu
Vie Sep 11 17:56:16 CEST 2009


Hola Susana,

Susana Sacie wrote:
> hola, pues vereis, estoy trabando con el siguiente tipo estructurado 
> pero no logro entender su estructura, a ver si me la podeis describir:
> 

José Álvaro ya te ha explicado que se trata de un puntero a una función. 
Sugiero consultar el capítulo 20 de nuestro curso de C++. El enlace es: 
http://c.conclase.net/curso/index.php?cap=020b#FUN3_puntfunc

> 
> a=h->fn.transceive(h, cmd, 5, retbuf, &retlen); //parece como si fuese 
> una función, incluso pasa retlen
>                                                                               
>   //por referencia para que la modifique

Estamos invocando la función que el campo 'transceive' tiene guardada. 
Como se trata de una función, podemos invocarla como cualquier otra.

>  if (a<0) {// ahora analiza el valor de a, yo pienso que este valor 
> habrá sido almacenado antes ya que
>               // la variable h es usada por otra funcion antes de 
> pasarla a la funcion llamada.      

Efectivamente. Acaba de ser almacenado en la sentencia anterior:

a = h->fn.transceive( h, cmd, 5, retbuf, &retlen );

Has guardado el valor de retorno de la llamada a la función en 'a', que 
es un 'int'.

>     return a;
>  }
> 
> return 0;
> }
> 
> y despues por ejemplo tengo una función con una serie de parametros:
> 
> static int librfid(struct mrtd_handle *h , const unsigned char *cmd, 
> unsigned int len, unsigned char *resp, unsigned int *rlen); //esta 
> funcion devuelve un entero en funcion de los parametros que se le pasan
> 
> y ahora de repente hago la siguiente llamada en otra función:
> struct mrtd_handle *h;
> h->fn.transceive = librfid;     //¿ porque se puede llamar a librfid 
> sin pasarle ningun parametro?
> 

La respuesta es que no estamos llamando a 'librfid'. Lo que estamos 
haciendo es asignar la función 'librfid' al puntero 'transceive'. 
Posteriormente, invocaremos a 'librfid' a través de 'transceive', como 
haremos en 'llamada'.

Esto se aclarará cuando veas y estudies el tema de punteros a funciones.


Espero haber aclarado las dudas.

Steven






Más información sobre la lista de distribución Cconclase