Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problemas C, funcion con punteros y nombres repetidos

Estas en el tema de Problemas C, funcion con punteros y nombres repetidos en el foro de C/C++ en Foros del Web. Buen dia gente, estoy comenzando con c y tengo dos dudas. Estoy usando una estructura que a su vez usa otra estructura, cada estructura tiene ...
  #1 (permalink)  
Antiguo 27/09/2013, 20:32
 
Fecha de Ingreso: octubre-2012
Mensajes: 33
Antigüedad: 11 años, 6 meses
Puntos: 0
Problemas C, funcion con punteros y nombres repetidos

Buen dia gente, estoy comenzando con c y tengo dos dudas.

Estoy usando una estructura que a su vez usa otra estructura, cada estructura tiene una funcion insertar. Hay forma de hacer que funcione?
Lo mismo me pasa en el programa principal, tengo include estructura1.h e include estructura2.h y solo me permite usar el insertar de estructura 1. No hay forma de simular una sobrecarga o algo asi?


mi otra duda es, que debo pasarle a una función con encabezado funcion(int (*f) int uno, int dos)? Si la paso un puntero a una función da errr(aunque el error dice que se espera algo igual a lo que recibe)

Última edición por sfermat; 27/09/2013 a las 22:39
  #2 (permalink)  
Antiguo 28/09/2013, 04:16
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 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
  #3 (permalink)  
Antiguo 28/09/2013, 13:13
 
Fecha de Ingreso: octubre-2012
Mensajes: 33
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Problemas C, funcion con punteros y nombres repetidos

La parte de las funciones creo que me quedo claro, gracias. Ahora lo siguiente:

Voy a intentar ser mas claro. Tengo un TDA listaOrdenada y un TDA multiset.
Dentro del multiset tengo una operacion que retorna una listaOrdenada, ambos TDA tienen operaciones llamadas insertar y ahi es donde se produce el error
  #4 (permalink)  
Antiguo 28/09/2013, 15:03
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Problemas C, funcion con punteros y nombres repetidos

Sigo sin verlo claro, en C no puedes declarar funciones dentro de las estructuras, en todo caso puedes declarar punteros a funciones y no tendras problema por los nombres repetidos.

Supongo que tienes la listaOrdenada en una cabecera y el multiset en otra y ademas la cabecera del multiset incluye la de la listaOrdenada; cada cabecera tiene sus funciones pero al incluir ambas en la misma compilacion no puedes duplicar los nombres, en cualquier caso puedes usar prefijos para las funciones que se aplican sobre la lista ordenada y otro para las que se aplican al multiset:

Código C:
Ver original
  1. //listaOrdenada.h
  2. #ifndef LISTAORDENADA
  3. #define LISTAORDENADA
  4.  
  5. typedef struct {
  6.    ...
  7. } LISTAORDENADA;
  8.  
  9. void insertar() {
  10. }
  11.  
  12. #endif

Código C:
Ver original
  1. //multiset.h
  2. #ifndef MULTISET
  3. #define MULTISET
  4.  
  5. #include "listaOrdenada.h"
  6.  
  7. typedef struct {
  8.    ...
  9. } MULTISET;
  10.  
  11. void insertar() {//error
  12. }
  13.  
  14. #endif

Al incluir las dos fuentes en la compilacion C no permite duplicar los nombres de las funciones con lo que no puedes sobrecargar las funciones tal como harias en c++. La unica solucion es usar una unica funcion para todo y usar un identificador de tipo para saber con que estructura estas trabajando (tal como te puse en el ejemplo de arriba en el otro post), y la otra opcion es usar prefijos para nombrar las funciones; en el caso de estas dos cabeceras que pongo como ejemplo los prefijos podrian ser 'lo_insertar()' y 'ms_insertar()' (es un ejemplo, puedes usar prefijos, sufijos o lo que te de la gana pero no duplicar los nombres).

Saludos
vosk
  #5 (permalink)  
Antiguo 28/09/2013, 22:50
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 8 meses
Puntos: 13
Respuesta: Problemas C, funcion con punteros y nombres repetidos

Aunque no logro dar con el problema, si las funciones están en archivos .h separados puedes usar

Código C:
Ver original
  1. static void función(...)

El static permite que la función sea solo de uso en esa cabecera, por lo tanto, puedes tener varias funciones con el mismo nombre en cabeceras diferentes.

Referencia
http://gd.tuwien.ac.at/languages/c/c...TAX/static.htm
  #6 (permalink)  
Antiguo 29/09/2013, 14:27
 
Fecha de Ingreso: octubre-2012
Mensajes: 33
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Problemas C, funcion con punteros y nombres repetidos

excatamente se es mi problema. La imposibilidad de sobrecarga... Voy a usar los prefijos mientras tanto, porque creia que tenia que respetar la interace que me dieron.

Con respecto a declararlas de tipo static, no es una posible solucion porque existe un tercer .c que debe hacer uso de las estructuras.
Gracias a los dos

Etiquetas: funcion, nombres, programa, punteros, repetidos, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:23.