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

Necesito ayuda en C!!

Estas en el tema de Necesito ayuda en C!! en el foro de C/C++ en Foros del Web. Hola, Soy relativamente nuevo en el tema de las estructuras abstractas de datos (TADs) y tengo una duda: Me gustaría saber cómo es posible -si ...
  #1 (permalink)  
Antiguo 16/08/2006, 10:06
 
Fecha de Ingreso: octubre-2005
Mensajes: 42
Antigüedad: 19 años, 1 mes
Puntos: 0
Necesito ayuda en C!!

Hola,

Soy relativamente nuevo en el tema de las estructuras abstractas de datos (TADs) y tengo una duda:

Me gustaría saber cómo es posible -si es posible- hacer que en un determinado TAD implementado en C (pongamos por ejemplo uno simple, como una pila) se puedan almacenar varios tipos de datos distintos. Sé que en Java sería algo simple como aplicar herencia, pero la verdad es que en C no se me ocurre ninguna solución.

Ejemplo: tengo un TAD pila donde voy apilando libros, pero de vez en cuando también quiero apilar alguna revista. Lo mismo podría ser con un árbol binario de enteros donde también quiero añadir caracteres. En vez de programar un árbol distinto para cada tipo, ¿es posible utilizar una misma implementación del árbol totalmente genérica?

Gracias de antemano por si alguien sabe responder a mi duda.

Chao!
  #2 (permalink)  
Antiguo 16/08/2006, 16:11
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años
Puntos: 52
No entendi muy bien tu pregunta... haber si es la solucion que buscas.

En un caso podrias tener varios tipos de datos en la estructura(ya que estas hablando de C puro).

struct estructura {
int libro, revista;
};

Esto obviamente es ineficiente, pero funciona.

Otra manera seria que usaras uniones en vez de estructuras, asi puedes tener todo tipo de datos:

union union{
int libro;
float valor;
};

Esto es un poco mas generico.

Y la ultima manera que NO ES CON C PURO es usando las plantillas de C++.

Segun entendi tu problema, lo que necesitas es un poco de programacion generica, y esto se logra de 2 maneras: unos typedefs y defines o plantillas.
Las plantillas ya son estandar y depurables, los defines pueden ser usandos en C puro pero no son depurables como las plantillas.

Saludos
  #3 (permalink)  
Antiguo 16/08/2006, 18:09
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 7 meses
Puntos: 2
Otra opcion es usar los punteros a void(void*)

como se hacien en Java antes de los generics.(Se usaba la clase Object).

en C para se puede simular usando los punteros a void.

claro tienes que implementar una interfas comun para tus estructuras, esto lo puedes hacer usando punteros a funcion.


ejemplo:

#define REVISTA 100;
#define LIBRO 200;

typedef struct
{
int tipo;
void(*HacerPrimero)(void*);
void(*HacerDespues)(void*);
}Libro;

typedef struct
{
int tipo;
void(*HacerPrimero)(void*);
void(*HAcerDespues)(void*);
}Revista;

esto te permitiria hacer cosas como;

void* objetos[2];

objetos[0] = malloc(sizeof(Libro));
objetos[1] = malloc(sizeof(Revista));

/*Hacer las asignaciones de funciones a los punteros.
y otra operacion ha hacer con un libro y una revista respectivamente.*/

/*y ya despues podemos hacer.*/
((Libro*)objetos[0])->HacerPrimero(objetos[0]);
((Revista*)objetos[1])->HacerPrimerp(objetos[1]);

en fin, que de esta forma podemos simular polimorfismo.
con un poco de dificultad.

Saludos.
  #4 (permalink)  
Antiguo 21/08/2006, 09:06
 
Fecha de Ingreso: octubre-2005
Mensajes: 42
Antigüedad: 19 años, 1 mes
Puntos: 0
Gracias a ambos por la respuesta. Creo que me irá bastante bien. Si tengo alguna duda ya la postearé.

Chao!
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 13:44.