Reutilizacion de codigo

Iniciado por acoevil, 20 Abril 2013, 21:11 PM

0 Miembros y 1 Visitante están viendo este tema.

acoevil

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.

85

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 ) {
   
             ;
}


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

do-while

¡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!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

rir3760

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.

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
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

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.
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

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.
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

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.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar