Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: acoevil en 20 Abril 2013, 21:11 pm



Título: Reutilizacion de codigo
Publicado por: acoevil en 20 Abril 2013, 21:11 pm
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.


Título: Re: Reutilizacion de codigo
Publicado por: 85 en 20 Abril 2013, 21:40 pm
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..

Código:
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.
Código:
void crear( void * entero ) {
    
              ;
}



Título: Re: Reutilizacion de codigo
Publicado por: do-while en 20 Abril 2013, 22:18 pm
¡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...:

Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. int intcmp(void *v1, void *v2)
  7. {
  8.    if(*((int*)v1) < *((int*)v2))
  9.        return -1;
  10.  
  11.    if(*((int*)v1) > *((int*)v2))
  12.        return 1;
  13.  
  14.    return 0;
  15.  
  16. }
  17.  
  18. int floatcmp(void *v1, void *v2)
  19. {
  20.    if(*((float*)v1) < *((float*)v2))
  21.        return -1;
  22.  
  23.    if(*((float*)v1) > *((float*)v2))
  24.        return 1;
  25.  
  26.    return 0;
  27. }
  28.  
  29. void* buscar(void *valor, void *vector, int nelementos, unsigned int tam_dato, int (*cmp)(void *, void*))
  30. {
  31.    int i;
  32.  
  33.    for(i = 0 ; i < nelementos ; i++)
  34.        if(!cmp(valor, ((char*)vector) + i * tam_dato))
  35. return ((char*)vector) + i * tam_dato);
  36.  
  37.    return NULL;
  38. }
  39.  
  40. int main(int argc, char *argv[])
  41. {
  42.    int vint[] = {1,2,3,4,5},x,*iptr;
  43.    int vfloat[] = {1.,2.,3.,4.,5.},y,*fptr;
  44.  
  45.    x = 3;
  46.  
  47.    if(iptr = (int*) buscar(&x,vint,5,sizeof(int),intcmp))
  48.        printf("%d pertenece al vector de enteros\n", *iptr);
  49.    else
  50.        printf("%d no pertenece al vector de enteros\n", x);
  51.  
  52.    y = 7.;
  53.  
  54.    if(fptr = (float*) buscar(&y,vfloat,5,sizeof(float),floatcmp))
  55.        printf("%f pertenece al vector de enteros\n", *fptr);
  56.    else
  57.        printf("%f no pertenece al vector de enteros\n", y);    
  58.  
  59.    return 0;
  60. }
  61.  
  62.  

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!


Título: Re: Reutilizacion de codigo
Publicado por: rir3760 en 21 Abril 2013, 17:51 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


Título: Re: Reutilizacion de codigo
Publicado por: 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.


Título: Re: Reutilizacion de codigo
Publicado por: 0xDani en 22 Abril 2013, 16:30 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.


Título: Re: Reutilizacion de codigo
Publicado por: amchacon en 22 Abril 2013, 17:33 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.