Programación General > C/C++

 [C] Estructuras y punteros a funciones

(1/1)

AmadeoMagnus:
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:


--- Código: Text ---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):



--- Código: Text ---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í nada, la cambié y la deje así:


--- Código: Text ---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):


--- Código: Text ---typedef void* destruir_dato_t; 

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


--- Código: Text ---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:


--- Código: Text ---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 carajo se hace para usar bien una función almacenada en una estructura?  :wacko:


Saludos.

Geo:
Ponle atención al error, porque, en efecto, destruir_data no es una función, sino un puntero doble a void.

Este es un ejemplo de llamadas a una función mediante punteros:

--- Código: C --- #include <cstdio>#include <cstdlib>#include <cstring> // Funciónvoid imprimeValor( int valor ) {    printf( "Valor es: %dn", valor );} // Una estructura con un miembro que es un puntero a funciónstruct Prueba {    int x;    void ( *ptrFunc )( int );}; // Función que recibe como parámetro otra función y una variable intvoid ejecutaFuncion( void ( *ptr )( int ), int valor ) {    // Ejecuta la función recibida como parámetro pasando el segundo parámetro recibido    // como parámetro para la función llamada    ptr( valor );} int main() {    // Crea una instancia de Prueba    Prueba miPrueba;     // El miembro ptrFunc apunta a imprimeValor    miPrueba.ptrFunc = imprimeValor;    // Ejecuta imprimeValor mediante la variable miembro ptrFunc    miPrueba.ptrFunc( 10 );     // Pasa imprimeValor como parámetro    ejecutaFuncion( imprimeValor, 13 );     system( "pause" );    return 0;}  Nota cómo se declara un puntero a función, tanto en la estructura como para el parámetro de ejecutaFuncion.

Navegación

[0] Índice de Mensajes

Ir a la versión completa