elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Reutilizacion de codigo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Reutilizacion de codigo  (Leído 3,003 veces)
acoevil

Desconectado Desconectado

Mensajes: 25


Ver Perfil
Reutilizacion de codigo
« 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.


En línea

85

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Re: Reutilizacion de codigo
« Respuesta #1 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 ) {
    
              ;
}



En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Reutilizacion de codigo
« Respuesta #2 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!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Reutilizacion de codigo
« Respuesta #3 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.

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 línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Reutilizacion de codigo
« Respuesta #4 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.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Reutilizacion de codigo
« Respuesta #5 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.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Reutilizacion de codigo
« Respuesta #6 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.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines