[C] Estructuras y punteros a funciones

Iniciado por Amadeo Magnus, 10 Octubre 2010, 22:32 PM

0 Miembros y 1 Visitante están viendo este tema.

Amadeo Magnus

Buenas, tengo el sig. problema. Estoy haciendo una tabla de hash abierta (en C)... los profesores nos tiran las primitivas y nosotros lo tenemos que implementar.
Esta es la estructura del hash:

struct _hash_t {
    size_t largo;
    size_t cantidad;
    destruir_dato_t* destruir_dato; /*función para destruir un dato*/
    lista_t** vector; /*arreglo de punteros que apuntan a listas*/
};




El problema es con la primitiva "hash_crear" que es así (originalmente):


typedef void destruir_dato_t (hash_dato_t);

hash_t* hash_crear(destruir_dato_t destruir_dato);



Supuestamente eso que le pasas por parámetro es una función para destruir un dato. Ahora, como no entendí una chagar, la cambié y la deje así:

hash_t* hash_crear(destruir_dato_t (*destruir_dato)(hash_dato_t* valor))

y el typedef ese de arriba lo deje así (en el .h):

typedef void* destruir_dato_t;


Bueno, después cuando creo el hash, al final le pongo:

hash->destruir_dato = destruir_dato;

que sería la función que le pase.



Después, tengo otra función que es "hash_guardar" a la cuál entre otras cosas le paso una clave , y básicamente sitúa un iterador en X posición del arreglo (la que me devuelve una función de hashing), recorre la lista apuntada por esa posición, y si hay algún nodo de la lista cuya clave coincide con la clave que le pase a hash_guardar, lo borra y crea otro nodo con otros datos y lo inserta. El tema es cuando quiero borrar, que llamo a esta función:

hash->destruir_dato(dato_aux);

Y el compilador me tira "hash.c:161: error: el objeto 'hash->destruir_dato' llamado no es una función"


Entonces... ¿cómo se hace para usar bien una función almacenada en una estructura?  :huh:


Saludos.
El secreto del éxito es la constancia.

Karman

#1
typedef void* hash_dato_t;//???
typedef void (*destruir_dato_t )(hash_dato_t);

struct _hash_t {
   size_t largo;
   size_t cantidad;
   destruir_dato_t destruir_dato; /*función para destruir un dato*/
   lista_t** vector; /*arreglo de punteros que apuntan a listas*/
};

void destruir_dato(hash_dato_t){
 //code
}

hash_t* hash_crear(destruir_dato_t destruir_dato){
/*
new/maloc part
*/
hash->destruir_dato = destruir_dato;
return hash;
}

//code?

hash=hash_crear(destruir_dato);
hash->destruir_dato(dato_aux);


S2