Ver Mensaje Individual
  #2 (permalink)  
Antiguo 28/09/2013, 04:16
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 2 meses
Puntos: 83
Respuesta: Problemas C, funcion con punteros y nombres repetidos

No se si entiendo bien la duda, pero asi de pronto me parece que deberias usar un puntero a una funcion. Obviamente todas las funciones de un mismo codigo deben tener nombres diferentes (al menos hasta donde yo se) por mucho que los declares en diferentes cabeceras el compilador asignará una direccion a cada funcion, eso significa que solo puede haber una funcion por cada nombre de funcion.

Te planteo lo siguiente:

Código C:
Ver original
  1. typedef struct {
  2.     int valor;
  3.     void (*insertar) (char , void *, int );
  4. } DATO;
  5.  
  6.  
  7. typedef struct {
  8.     int valor;
  9.     DATO dato;
  10.     void (*insertar) (char , void *, int );
  11. } BASE;
  12.  
  13.  
  14. void insertar(char tipo, void *ptr, int valor) {
  15.     if(tipo) {
  16.         ((BASE *)ptr)->valor = valor;
  17.     }
  18.     else {
  19.         ((BASE *)ptr)->dato.valor = valor;
  20.     }
  21. }
  22.  
  23.  
  24. int main () {
  25.     BASE base;
  26.  
  27.     base.insertar = insertar;
  28.     base.dato.insertar = insertar;
  29.  
  30.     base.insertar(1, &base, 123);
  31.     base.insertar(0, &base, 456);
  32.  
  33.     printf("%d -> %d\n", base.valor, base.dato.valor);
  34.  
  35.     return 0;
  36. }

Puede que hay alguna forma mas elegante de trabajar. El nombre de la funcion es el mismo, y los argumentos son: un tipo (en este caso es la forma mas simple !=0 si es la base, ==0 si es el dato, puedes implementar una lista de tipos e incluso asignarles nombres textuales), un puntero ptr que equivale al puntero this de c++, y un valor para asignar.

Ten en cuenta que esto solo sirve para automatizar acciones identicas sobre diferentes datos, es decir en este caso asigno el valor 'dato'. En caso que la funcion 'asignar' de la estructura BASE haga una accion y la funcion 'asignar' de la estructura DATO haga otra accion completamente distinta ya no tiene sentido hacer todo esto, aunque puede implementarse igual es mejor que uses dos funciones con dos nombres diferentes. Esto es habitual en librerias.

Saludos
vosk