Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ALONSOQ en 3 Septiembre 2012, 13:38 pm



Título: funciones INT vs VOID
Publicado por: ALONSOQ en 3 Septiembre 2012, 13:38 pm
Buenas,

Una pregunta que me gustaría me aclaraseis,

A la hora de trabajas la función principal con funciones, estas puedes ser void ( no devuelven nada) int (devuelven un parametro), Por ejemplo sumar dos números, se puede hacer de las dos formas; ¿ es recomendable hacerlo de alguna de las dos formas en concreto o se pueden usar indistintamente?

gracias


Título: Re: funciones INT vs VOID
Publicado por: avesudra en 3 Septiembre 2012, 15:18 pm
Depende de para qué , si entiendes punteros , el valor se pasa por referencia y entonces no hace falta que devuelva nada por lo tanto se utiliza void , pero si no pasas ningún puntero si te hace falta que devuelva algo por ser una función auxiliar pues no puede ser void, depende de para qué lo uses.Te pongo un ejemplo:
Código
  1. #include<stdio.h>
  2. void sumar(int *num1, int num2)//Pasamos num1 por referencia y num2 por valor.
  3. {
  4.    *num1 += num2;//Asignamos al contenido num1 la suma del contenido num1 + num2.
  5. }
  6. void sumar(int *num1,int *num2)//Pasamos num1 y num2 por referencia.
  7. {
  8.    *num1+=*num2;//Asignamos al contenido de num1 la suma del contenido de num1 mas el contenido de num2.
  9. }
  10. int sumar(int num1, int num2)//Pasamos num1 y num2 por valor.
  11. {
  12.    return (num1+num2);//Retornamos su suma.
  13. }
  14. int main(int argc , char * argv[])
  15. {
  16.    int num1 = 2;
  17.    int num2 = 3;
  18.    sumar(&num1,num2);
  19.    printf("Funcion void pasando num1 por referencia y num2 por valor , se suma el contenido de num1 a num2 y se asigna a num1.Resultado: %d\n\n",num1);
  20.    //Reseteamos valores.
  21.    num1=2;
  22.    num2=3;
  23.    sumar(&num1,&num2);
  24.    printf("Funcion void pasando num1 y num2 por referencia   , se suma el contenido de num1 al contenido de num2 y se asigna al contenido de num1.Resultado: %d\n\n",num1);
  25.    //Reseteamos valores.
  26.    num1=2;
  27.    num2=3;
  28.    printf("Funcion int pasando num1 y num2 por valor y retornando su suma.Resultado: %d\n",sumar(num1,num2));
  29.    return 0;
  30. }
  31.  
La salida por consola es:
Código:
Funcion void pasando num1 por referencia y num2 por valor , se suma el contenido
 de num1 a num2 y se asigna a num1.Resultado: 5

Funcion void pasando num1 y num2 por referencia   , se suma el contenido de num1
 al contenido de num2 y se asigna al contenido de num1.Resultado: 5

Funcion int pasando num1 y num2 por valor y retornando su suma.Resultado: 5

Es muchísimo más manejable la int , además usan la misma cantidad de memoria las trés , eso sí no sé si por que la int retorna ,igual es más lenta(a escala muy pequeña) no tengo ni idea.


Título: Re: funciones INT vs VOID
Publicado por: 0xDani en 3 Septiembre 2012, 15:30 pm
Yo diria la que menos memoria utiliza es la que pasa los dos numeros por referencia, ya que no se hace una copia de sus valores para operar.

Saludos.


Título: Re: funciones INT vs VOID
Publicado por: avesudra en 3 Septiembre 2012, 15:32 pm
Yo diria la que menos memoria utiliza es la que pasa los dos numeros por referencia, ya que no se hace una copia de sus valores para operar.

Saludos.
Pero se pasa la referencia , y el puntero a int , vale 4 bytes... No lo sé seguro la verdad.

¡Un saludo!


Título: Re: funciones INT vs VOID
Publicado por: xiruko en 3 Septiembre 2012, 15:40 pm
Citar
Yo diria la que menos memoria utiliza es la que pasa los dos numeros por referencia, ya que no se hace una copia de sus valores para operar.

yo estoy contigo... quizas en el caso de int sea lo mismo, pero si la variable es por ejemplo un struct con varios campos, la diferencia si que es notable. por ejemplo:

Código
  1. struct prueba {
  2. int a, b, c;
  3. char d, f, *g;
  4. float h, i, j;
  5. };
  6.  

aqui una variale struct ocupa 40 bytes y en cambio un puntero al struct ocupa 8 bytes.

un saludo!

por cierto, acabo de hacer un sizeof(int*) y a mi me da que son 8 bytes, igual que cualquier otro puntero.


Título: Re: funciones INT vs VOID
Publicado por: avesudra en 3 Septiembre 2012, 15:54 pm
yo estoy contigo... quizas en el caso de int sea lo mismo, pero si la variable es por ejemplo un struct con varios campos, la diferencia si que es notable. por ejemplo:

Código
  1. struct prueba {
  2. int a, b, c;
  3. char d, f, *g;
  4. float h, i, j;
  5. };
  6.  

aqui una variale struct ocupa 40 bytes y en cambio un puntero al struct ocupa 8 bytes.

un saludo!

por cierto, acabo de hacer un sizeof(int*) y a mi me da que son 8 bytes, igual que cualquier otro puntero.
Buena observación , pues claro igual con int no pero con otras cosas si como son las estructuras, ahora si que estoy con ustedes.Pues a mi me da 4 bytes con este código igual es que estoy compilando para 32 bits no sé:
Código
  1. #include<stdio.h>
  2. int main(int argc , char * argv[])
  3. {
  4.    printf("Sizeof int* : %d bytes",sizeof(int*));
  5.    return 0;
  6. }
  7.  
Código:
Sizeof int* : 4 bytes
Process returned 0 (0x0)   execution time : 0.025 s
Press any key to continue.


Título: Re: funciones INT vs VOID
Publicado por: Oblivi0n en 3 Septiembre 2012, 16:13 pm
La mas correcta suele ser la de usar parametros, es mas simple de usar, no podemos atenernos a conceptos de uso de memoria por parte de un programa ( que los ordenadores de hoy en dia  no tienen 256k de memoria... )


Título: Re: funciones INT vs VOID
Publicado por: avesudra en 3 Septiembre 2012, 16:31 pm
La mas correcta suele ser la de usar parametros, es mas simple de usar, no podemos atenernos a conceptos de uso de memoria por parte de un programa ( que los ordenadores de hoy en dia  no tienen 256k de memoria... )
Pero aún así si lo entiendes , puedes hacer un mejor programa digo yo.No te digo que para esto que es un simple número pero para un programa mayor que pongamos que use 600 MB de un array de estructuras... pues estaría bien usar punteros creo yo  :xD


Título: Re: funciones INT vs VOID
Publicado por: Oblivi0n en 3 Septiembre 2012, 16:44 pm
Cuando el programa maneja un gran numero de datos en memoria, lo que se suelen hacer es modelos matemáticos para evitar sobrecargar la memoria y desarrollar un algoritmo en consecuencia. Recuerda que los puntero además, son memoria dinámica, y van al heap, y este también tiene un espacio limitado... ( mucho mas limitado que el conjunto de la RAM )


Título: Re: funciones INT vs VOID
Publicado por: avesudra en 3 Septiembre 2012, 17:04 pm
Cuando el programa maneja un gran numero de datos en memoria, lo que se suelen hacer es modelos matemáticos para evitar sobrecargar la memoria y desarrollar un algoritmo en consecuencia. Recuerda que los puntero además, son memoria dinámica, y van al heap, y este también tiene un espacio limitado... ( mucho mas limitado que el conjunto de la RAM )
Mmmm entiendo , pero no llego a ese nivel , ¿sabes de algún escrito o libro que hable sobre eso? , cualquiera de algoritmos y estructuras de datos supongo ¿no? , no sé lo que es el heap, presupongo que será un espacio limitado para la acumulación de punteros , ya lo buscaré , gracias por la información Oblivi0n.

¡Un saludo!


Título: Re: funciones INT vs VOID
Publicado por: Oblivi0n en 3 Septiembre 2012, 17:17 pm
Si, supongo que en cualquier libro de estructuras de datos y algoritmos se tendrá que tratar estás cosas ( cuando hablo de "modelos matemáticos" son cosas sencillas eh, no te asustes  xD ).

El heap es el espacio de memoria reservado para cada programa para que almacene dinamicamente ( me explico fatal ), es decir, es como un contenedor para cada programa.

Un saludo!


P.D: No tengo nada en contra de los punteros a funcion , que lo parece  :xD


Título: Re: funciones INT vs VOID
Publicado por: avesudra en 3 Septiembre 2012, 21:17 pm
Si, supongo que en cualquier libro de estructuras de datos y algoritmos se tendrá que tratar estás cosas ( cuando hablo de "modelos matemáticos" son cosas sencillas eh, no te asustes  xD ).

El heap es el espacio de memoria reservado para cada programa para que almacene dinamicamente ( me explico fatal ), es decir, es como un contenedor para cada programa.

Un saludo!


P.D: No tengo nada en contra de los punteros a funcion , que lo parece  :xD
Me había asustado sí , lo tengo que reconocer jajaja, mmm digamos que es el espacio reservado de memoria dinámica, para cada programa? Pues a mi no me lo parece hombre, está bien que des tus explicaciones y el porqué de todo.


Título: Re: funciones INT vs VOID
Publicado por: Oblivi0n en 3 Septiembre 2012, 21:54 pm
Esto ilustra lo que te quería comentar: (http://www.redhat.com/magazine/009jul05/features/execshield/figs/valayout.jpg) Donde pone "data for small objects" se refiere al heap ( o "monton" en español ).

Si quieres, intentaré mirar por algun libro que tenga de estructuras de datos(en español), o alguna clase por youtube ( si sabes inglés claro ), en los que explican estos conceptos.

Si me acuerdo, me pongo en contacto contigo  :xD


Título: Re: funciones INT vs VOID
Publicado por: avesudra en 4 Septiembre 2012, 01:59 am
Esto ilustra lo que te quería comentar: (http://www.redhat.com/magazine/009jul05/features/execshield/figs/valayout.jpg) Donde pone "data for small objects" se refiere al heap ( o "monton" en español ).

Si quieres, intentaré mirar por algun libro que tenga de estructuras de datos(en español), o alguna clase por youtube ( si sabes inglés claro ), en los que explican estos conceptos.

Si me acuerdo, me pongo en contacto contigo  :xD
No estaria mal , pero el inglés de oido fatal pero bueno si los tienes a mano un cable que echas!

¡Un saludo y muchas gracias!


Título: Re: funciones INT vs VOID
Publicado por: ALONSOQ en 4 Septiembre 2012, 16:49 pm
Gracias por vuestras respuestas.

Gracias Avesudra por tu respuesta tan detallada

un saludo