[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