Buenas como están, resulta que estoy aprendiendo a programar en c++.
La pregunta mía es, como puedo hacer para que la siguiente función
void crear( struct Proveedores **entero ) {
*entero = NULL;
}
Me reciba cualquier tipo de estructura, por ejemplo la anterior solo me recibe una estructura de proveedores, es posible que pueda usar esta funcion para pasar otras estructuras por ejemplo struct Clientes etc?
Muchas gracias a todos.
Vamos a obviar el contenido de la función por un momento..... el parámetro con doble puntero es lo mismo, es un puntero también, sólo que apunta a otro puntero. no es necesario en este caso..
void crear( struct Proveedores * entero ) {
;
}
El tipo 'VOID' sirve para lo que necesitás, después de todo, un puntero sigue siendo un puntero sea cual sea el tipo de dato de su declaración.
void crear( void * entero ) {
;
}
¡Buenas!
Si quieres crear funciones genericas que trabajen sobre listas, vectores, arboles... puedes recurrir a punteros void, y punteros a funciones para facilitar la insercion, busqueda...:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int intcmp(void *v1, void *v2)
{
if(*((int*)v1) < *((int*)v2))
return -1;
if(*((int*)v1) > *((int*)v2))
return 1;
return 0;
}
int floatcmp(void *v1, void *v2)
{
if(*((float*)v1) < *((float*)v2))
return -1;
if(*((float*)v1) > *((float*)v2))
return 1;
return 0;
}
void* buscar(void *valor, void *vector, int nelementos, unsigned int tam_dato, int (*cmp)(void *, void*))
{
int i;
for(i = 0 ; i < nelementos ; i++)
if(!cmp(valor, ((char*)vector) + i * tam_dato))
return ((char*)vector) + i * tam_dato);
return NULL;
}
int main(int argc, char *argv[])
{
int vint[] = {1,2,3,4,5},x,*iptr;
int vfloat[] = {1.,2.,3.,4.,5.},y,*fptr;
x = 3;
if(iptr = (int*) buscar(&x,vint,5,sizeof(int),intcmp))
printf("%d pertenece al vector de enteros\n", *iptr);
else
printf("%d no pertenece al vector de enteros\n", x);
y = 7.;
if(fptr = (float*) buscar(&y,vfloat,5,sizeof(float),floatcmp))
printf("%f pertenece al vector de enteros\n", *fptr);
else
printf("%f no pertenece al vector de enteros\n", y);
return 0;
}
Prueba a compilarlo y ejecutarlo (en este momento no tengo ningun compilador a mano asi que no se si hay errores). A pesar de que de esta forma ganas generalidad con el codigo, estas perdiendo algo de claridad. Ya ves que para poder realizar desplazamientos a partir de un puntero a void, primero tienes que convertirlo a char y desplazar el numero de bytes que corresponde segun el tipo de dato con el que estes trabajando. Tambien es un poco caotica la funcion de comparacion que tienes que crear para cada tipo de dato, pero al final sales ganando en que puedes reutilizar tu codigo siempre que te haga falta, lo unico que tendras que hacer es crear la funcion de comparacion para el tipo de dato que quieras.
Ademas, para un mismo tipo de dato, puedes construir funciones de comparacion distintas. Imagina que tienes una bibilioteca con su correspondiente struct libro y una funcion que te ordene un vector segun la funcion de comparacion que le pases como parametro. Podras ordenar los libros por orden alfabetico de titulo, de autor, por fecha de publicacion o por lo que quieras, tan solo tendras que crear una funcion que compare los libros segun los parametros que quieras comparar.
¡Saludos!
Cita de: acoevil en 20 Abril 2013, 21:11 PM
La pregunta mía es, como puedo hacer para que la siguiente función [...] Me reciba cualquier tipo de estructura, por ejemplo la anterior solo me recibe una estructura de proveedores, es posible que pueda usar esta funcion para pasar otras estructuras por ejemplo struct Clientes etc?
Es posible utilizando plantillas, en el tutorial de C plus plus se describe en la pagina (en ingles) Templates (http://www.cplusplus.com/doc/tutorial/templates/).
Pero en mi opinión es mejor que primero obtengas un buen manejo del lenguaje y su biblioteca estándar antes de meterte en ese tema.
Un saludo
En C++ lo más fácil son las plantillas:
http://c.conclase.net/curso/index.php?cap=040#inicio
Lo que pasa esque no es para funciones sino para clases.
Cita de: amchacon en 21 Abril 2013, 21:08 PM
En C++ lo más fácil son las plantillas:
http://c.conclase.net/curso/index.php?cap=040#inicio
Lo que pasa esque no es para funciones sino para clases.
Si que existen las plantillas para funciones, en el mismo enlace que has puesto vienen explicadas.
Saludos.
Cita de: 0xDani en 22 Abril 2013, 16:30 PM
Si que existen las plantillas para funciones, en el mismo enlace que has puesto vienen explicadas.
Saludos.
Ah vaya xD.
Pues eso es precisamente lo que necesitas.