funciones INT vs VOID

Iniciado por ALONSOQ, 3 Septiembre 2012, 13:38 PM

0 Miembros y 2 Visitantes están viendo este tema.

ALONSOQ

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

avesudra

#1
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:

#include<stdio.h>
void sumar(int *num1, int num2)//Pasamos num1 por referencia y num2 por valor.
{
   *num1 += num2;//Asignamos al contenido num1 la suma del contenido num1 + num2.
}
void sumar(int *num1,int *num2)//Pasamos num1 y num2 por referencia.
{
   *num1+=*num2;//Asignamos al contenido de num1 la suma del contenido de num1 mas el contenido de num2.
}
int sumar(int num1, int num2)//Pasamos num1 y num2 por valor.
{
   return (num1+num2);//Retornamos su suma.
}
int main(int argc , char * argv[])
{
   int num1 = 2;
   int num2 = 3;
   sumar(&num1,num2);
   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);
   //Reseteamos valores.
   num1=2;
   num2=3;
   sumar(&num1,&num2);
   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);
   //Reseteamos valores.
   num1=2;
   num2=3;
   printf("Funcion int pasando num1 y num2 por valor y retornando su suma.Resultado: %d\n",sumar(num1,num2));
   return 0;
}

La salida por consola es:

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.
Regístrate en

0xDani

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

avesudra

Cita de: 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.
Pero se pasa la referencia , y el puntero a int , vale 4 bytes... No lo sé seguro la verdad.

¡Un saludo!
Regístrate en

xiruko

#4
CitarYo 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:


struct prueba {
int a, b, c;
char d, f, *g;
float h, i, j;
};


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.

avesudra

#5
Cita de: xiruko en  3 Septiembre 2012, 15:40 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:


struct prueba {
int a, b, c;
char d, f, *g;
float h, i, j;
};


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é:
#include<stdio.h>
int main(int argc , char * argv[])
{
   printf("Sizeof int* : %d bytes",sizeof(int*));
   return 0;
}

Sizeof int* : 4 bytes
Process returned 0 (0x0)   execution time : 0.025 s
Press any key to continue.
Regístrate en

Oblivi0n

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

avesudra

Cita de: 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... )
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
Regístrate en

Oblivi0n

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 )

avesudra

Cita de: 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 )
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!
Regístrate en