• Domingo 22 de Diciembre de 2024, 17:32

Autor Tema:  [C] Estructuras y punteros a funciones  (Leído 2047 veces)

AmadeoMagnus

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
[C] Estructuras y punteros a funciones
« en: Domingo 10 de Octubre de 2010, 23:48 »
0
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
  1. struct _hash_t {
  2.     size_t largo;
  3.     size_t cantidad;
  4.     destruir_dato_t* destruir_dato; /*función para destruir un dato*/
  5.     lista_t** vector; /*arreglo de punteros que apuntan a listas*/
  6. };
  7.  



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


Código: Text
  1. typedef void destruir_dato_t (hash_dato_t);
  2.  
  3. hash_t* hash_crear(destruir_dato_t destruir_dato);
  4.  


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
  1. hash_t* hash_crear(destruir_dato_t (*destruir_dato)(hash_dato_t* valor))
  2.  

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

Código: Text
  1. typedef void* destruir_dato_t;
  2.  


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

Código: Text
  1. hash->destruir_dato = destruir_dato;
  2.  

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
  1. hash->destruir_dato(dato_aux);
  2.  

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

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: [C] Estructuras y punteros a funciones
« Respuesta #1 en: Lunes 11 de Octubre de 2010, 07:11 »
0
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
  1.  
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5.  
  6. // Función
  7. void imprimeValor( int valor ) {
  8.     printf( "Valor es: %dn", valor );
  9. }
  10.  
  11. // Una estructura con un miembro que es un puntero a función
  12. struct Prueba {
  13.     int x;
  14.     void ( *ptrFunc )( int );
  15. };
  16.  
  17. // Función que recibe como parámetro otra función y una variable int
  18. void ejecutaFuncion( void ( *ptr )( int ), int valor ) {
  19.     // Ejecuta la función recibida como parámetro pasando el segundo parámetro recibido
  20.     // como parámetro para la función llamada
  21.     ptr( valor );
  22. }
  23.  
  24. int main() {
  25.     // Crea una instancia de Prueba
  26.     Prueba miPrueba;
  27.  
  28.     // El miembro ptrFunc apunta a imprimeValor
  29.     miPrueba.ptrFunc = imprimeValor;
  30.     // Ejecuta imprimeValor mediante la variable miembro ptrFunc
  31.     miPrueba.ptrFunc( 10 );
  32.  
  33.     // Pasa imprimeValor como parámetro
  34.     ejecutaFuncion( imprimeValor, 13 );
  35.  
  36.     system( "pause" );
  37.     return 0;
  38. }
  39.  
  40.  
Nota cómo se declara un puntero a función, tanto en la estructura como para el parámetro de ejecutaFuncion.
La imaginación es el límite.
Hardware & Software | Mexchip