Estás en: Inicio >> Foros >> Informática >> Programación
Programación /

Punteros arreglos y funciones

Participa en el tema Punteros arreglos y funciones en el foro Programación.
A ver si se me entiende lo que quiero preguntar... Quiero hacer una función que ...

Buscar en este tema:
 
  •  
    _e_ escribió el 11/06/2004 a las 17:59 hs.
     
    ¿Mensaje inapropiado?
    #1 Punteros arreglos y funciones
    A ver si se me entiende lo que quiero preguntar...

    Quiero hacer una función que tome un vector de 100 numeros y me devuelva otro
    vector de 10 numeros y cada componente de este último se corresponde con la suma
    de diez componentes del vector de 100,( en realidad esto no es lo que quiero hacer, pero vale como ejemplo de lo que no se.)

    int *sumar(int *vector)
    {int suma[10];
    int t=-1;
    for(int j=0;j<100;j+=10)
    {t++;
    suma[t]=0;
    for(int i=j;i<(j+10);i++)
    suma[t]+=vector[i];
    }
    return suma;
    }

    void main (void)
    {int *vector_grande1=new int[100];
    int *vector_grande2=new int[100];
    int *vector_sumas1=new int[10];
    int *vector_sumas2=new int[10];
    //...
    //...
    //suponganse que aquí vector_grande ya está inicializado

    vector_sumas1=sumar(vector_grande1);

    //El problema aparece ahora

    vector_sumas2=sumar(vector_grande2);

    //EL PROBLEMA ES QUE AHORA vector_sumas2 tiene la misma dirección que
    //vector_sumas1 y por lo tanto pierdo la primer suma!!!!!!!!!!!!!!
    //¿¿¿¿¿¿¿¿¿¿¿ALGUIEN SABE COMO HACER ESTO????????????????????
    }

    +
     
    0
    Me gusta
     
    http://www.psicofxp.com/forums/programacion.313/198141-punteros-arreglos-y-funciones.html
    | Más
  • Kremar escribió el 11/06/2004 a las 22:15 hs. ¿Mensaje inapropiado?

    #2 Re: Punteros arreglos y funciones

    sisi. lo q tenes q hacer es q la funcion sumar pida un espacio nuevo de memoria para cada vector q devuelve, y q el user se encarge luego de liberarlo, EH

    digamos... algo asi... (la funcion la hise again, esta , si no la hise mal,

    int *sumar(int *vector)
    {
    int *suma = new int[10];
    int t=-1;


    for(int j=0;j<100;j+=10)
    {

    t++;
    suma[t]=0;
    for(int i=j;i<(j+10);i++)
    suma[t]+=vector[i];
    }
    return suma;

    }

    eso si... despues tendrias q liberar la memoria... aunke 10 bytes no matan a nadie...

    K
    Me gusta este mensaje
  • _e_ escribió el 13/06/2004 a las 11:01 hs. ¿Mensaje inapropiado?

    #3 Re: Punteros arreglos y funciones

    GRACIAS!!
    Eso funciona, lo único que no sé es como liberar el espacio reservado, porque si pusiera un
    delete(suma); antes del return, no tendría sentido.....
    y una vez que salgo de la función, la variable "no existe más"....
    Me gusta este mensaje
  • _Guido_ escribió el 13/06/2004 a las 11:42 hs. ¿Mensaje inapropiado?

    #4 Re: Punteros arreglos y funciones

    10 bytes no matan a nadie?
    suponete una función que se ejecuta 100 veces por segundo, ya tenes 1K por segundo... dejala corriendo 60 segundos, ya tenes 60K... en una hora tenes 3,6Mb y en un día, 86,4Mb...
    Lo que tenes es un memory leak, y no importa de cuanto es... siempre termina afectando...

    Saludos!!
    Me gusta este mensaje
  • _Guido_ escribió el 13/06/2004 a las 12:37 hs. ¿Mensaje inapropiado?

    #5 Re: Punteros arreglos y funciones

    tu error está aca:
    Código:
    int *sumar(int *vector) {
    int suma[10]; // <----------- creas una variable local
    // ............
    return suma; // <----------- devolves el puntero a la variable local
    } 
    Estas devolviendo un puntero a una variable local, las variables locales se crean en el stack de la llamada a la función, no en el espacio de memoria de tu programa...
    Lo que tenes que hacer es modificar el método, y poner el puntero de retorno dentro de los parámetros, de esta manera vos creas el espacio de memoria desde afuera, se lo pasás a la función, y despues cuando querés lo borrás... te quedaría algo asi:
    Código:
    int *sumar(const int *const vector, int const* suma) { // no pueden cambiar ni los datos ni el puntero de vector, no puede cambiar el puntero de suma
    	int t=-1;
    	for(int j=0;j<100;j+=10) {
    		t++;
    		suma[t]=0;
    		for(int i=j;i<(j+10);i++) {
    			suma[t]+=vector[i];
    		}
    	}
    	return suma;
    } 
    y lo usarías asi:

    Código:
    void main (void) {
    	int *vector_grande1=new int[100];
    	int *vector_grande2=new int[100];
    	int *vector_sumas1=new int[10];
    	int *vector_sumas2=new int[10];
    	//inicializás el vector...
    	vector_sumas1=sumar(vector_grande1, vector_sumas1); // en realidad el "vector_sumas1 = .." es
    	vector_sumas2=sumar(vector_grande2, vector_sumas2); // redundante... podrías obviarlo...
    	//usas los datos
    	//y cuando terminas
    	delete[] vector_grande1;
    	delete[] vector_grande2;
    	delete[] vector_sumas1;
    	delete[] vector_sumas2;
    } 


    Ahora... qué forma "inelegante" de hacer la suma del vector!!!!! permitime hacerte esta propuesta:

    Código:
    int *sumar(const int *const vector, int const* suma) {
    	for(int v=0; v<10;v++) {
    		suma[v]=0;
    		for(int s=0;s<10;s++) {
    			suma[v]+=vector[10*v+s];
    		}
    	}
    	return suma;
    }
     

    Así se entiende mucho mejor el código!...

    Saludos!!!
    Me gusta este mensaje
  • _e_ escribió el 13/06/2004 a las 19:13 hs. ¿Mensaje inapropiado?

    #6 Re: Punteros arreglos y funciones

    Eso parece funcionar....
    Aunque tengo que hacer un curso de elegancia....
    Gracias!....
    Me gusta este mensaje
Estás en: Inicio >> Foros >> Informática >> Programación


Estadísticas del tema
  • 5 RESPUESTAS
  • 2444 VISTAS
  • 3 USUARIOS RESPONDIERON
 
Ir arriba
Contacto | Acerca de | Ayuda | Términos Legales | privacidad | Pautas de convivencia | Mapa de los foros | TrabajÁ con nosotros
©2008 Psicofxp.com S.A. - Todos los derechos reservados
Certifica IAB