[C con Clase] tipo estructurado algo complejo

José Álvaro Domínguez Díaz ilgrim en gmail.com
Vie Sep 11 16:06:46 CEST 2009


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:
>
Muy buenas.

> struct mrtd_handle {
> int dgpresent;
> struct {
>         int (*transceive)(struct mrtd_handle *h, //este es el mismo tipo 
> estructurado que estoy declarando
>                   unsigned char *sbuf, unsigned int slen,
>                   unsigned char *rbuf, unsigned int *rlen);
>           } fn;
> };
> 
> y lo que no entiendo es el uso que hago de este tipo, os pongo una 
> funcion y llamadas que usan este tipo:
> 
> void llamada (struct mrtd_handle *h){
> int a;
> unsigned char cmd[5] = { 0x00, 0x84, 0x00, 0x00, 0x00 };
> unsigned char retbuf[256+2];
> unsigned int retlen = sizeof(retbuf);
> 
> *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


De hecho, es un puntero a funcion. Suele ser un uso avanzadillo de los 
punteros.
Imagina tener una matriz de varios punteros a funcion y poder ejecutar 
una u otra dependiendo de un valor determinado, unicamente referenciando 
al indice de la posicion que ocupa en el array. Tiene sus limitaciones, 
pero puede ser util en ocasiones(Creo haber visto algo similar 
utilizando Ncurses).

>  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.      
>     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?
> 

Ni idea. Imagino que ya tiene todo lo que necesita en memoria al 
haberselo pasado antes y no haber sido modificado(supongo), no lo se la 
verdad. Me resulta bastante extraño tambien.

Un Saludo.




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