Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: hugodavidx en 28 Febrero 2014, 00:12 am



Título: como regreso mas de un variable de una funcion con un apuntador??
Publicado por: hugodavidx en 28 Febrero 2014, 00:12 am
como puedo regresar mas  de un valor con un apuntador usando una funcion que retorne una sola variable o en este caso un apuntador q contenga 2 diferentes valores


Título: Re: como regreso mas de un variable de una funcion con un apuntador??
Publicado por: EzianGES en 28 Febrero 2014, 01:11 am
¿De dónde sacás el ejercicio? ¿qué tenés hecho hasta ahora?
Me hace acordar a uno del libro Jumping intro C++
¿Podrías darnos el ejercicio a ver si dice eso?  Me interesaría verlo.

Un abrazo :)


Título: Re: como regreso mas de un variable de una funcion con un apuntador??
Publicado por: patilanz en 28 Febrero 2014, 08:28 am
Se puede pero con una clase.


Título: Re: como regreso mas de un variable de una funcion con un apuntador??
Publicado por: vangodp en 28 Febrero 2014, 08:44 am
Para eso se utilizando una acción (Función que no devuelve nada).
http://www.youtube.com/watch?v=1lk3hMqk0Tw
https://www.youtube.com/watch?v=cicFrj4TRJ0
https://www.youtube.com/watch?v=8g9bdT005a8

Busque como pasar parámetros por referencia y por puntero.
Si haces una función que devuelva datos con return solo vas a poder devolver un valor por que la función se da por terminado justo en el return.

A cambio si haces una función que no retorne nada y pases los parámetros por punteros y/o referencias, puedes hacer un calculo(a mas) por ejemplo y el resultado lo devuelve justo a la dirección de memoria de la variable que has pasado a la función.
O sea, seria algo así como: Yo indico 2 o mas números a una acción para a hacer un par de operaciones para que me devuelva 2 resultados y envés de pasar parámetros normalmente(copiar esos datos en la función) estoy diciendo que las modifique donde están, sin hacer copias de esos datos y después tener que guárdalos.
Eso se hace por que indico en que posición de la memoria están las variables, la acción va hace el calculo y modifica el numero allá donde este y no necesito hacer return.
Normalmente con una función tendría que guardar el resultado nuevamente en una variable de esta manera y no obtendría solo un valor.
Un ejemplo de una acción con parámetros por referencia seria:
int resultado = funcionsumar(A,B);
Suponemos que esta función suma 2 valores pasados y hace el return, el paso siguiente seria o imprimir con acción (función que no devuelve nada es una acción) o guardar el valor y despues imprimir o hacer lo que sea con ese valor.

Vamos a ver con la accion:supongamos que en main tengo esas 3 variables.
int A=10;
int B=30;
int C=40
int resultado1= 0;
int resultado2 = 0;

Y ahora vemos nuestra acción:
void accion( int& a, int& b, int& c, int& r1, int& r2 ){//Parámetros por referencia
   r1 = a + b;
   r2 = c - 13;
}
Ya he devuelto los resultados(fácil ¿no?), no necesito return por que la acción no retorna nada, sino que hace directamente los calculos sobre los valores pasados por referencia modificando los allí mismo donde estan.

llamaríamos la acción de igual manera que la función si es por referencia:
accion(A, B, C, resultado1, resultado2);

El código seria así pasando tanto por referencia como por punteros:

Código
  1. #include <stdio.h>
  2.  
  3. void accionRef ( int& a, int& b, int& c, int& r1, int& r2 ) { /*Parametros por referencia*/
  4. r1 = a + b;
  5. r2 = c - 13;
  6. }
  7.  
  8. void accionPunt ( int* a, int* b, int* c, int* r1, int* r2 ) { /*Parametros por puntero*/
  9. *r1 = *a + *b +20;
  10. *r2 = *c - 13 + 112;
  11. }
  12.  
  13. int main () {
  14. int A = 10;
  15. int B = 30;
  16. int C = 40;
  17. int resultado1 = 0;
  18. int resultado2 = 0;
  19. /*Lamamos a la accion*/
  20. accionRef ( A, B, C, resultado1, resultado2 );
  21.  
  22. /* resultado1 aqui vale 40 y resultado2 vale 27*/
  23. /*si eso es asi he echo 2 calculos con una accion¿comprobemos?*/
  24.  
  25. printf ("resultado1: %d\n resultado2: %d\n ", resultado1, resultado2);
  26.  
  27. /*Ahora volvamos a hacer pero con punteros*/
  28. accionPunt ( &A, &B, &C, &resultado1, &resultado2 );
  29. printf ("resultado1: %d\n resultado2: %d\n ", resultado1, resultado2);
  30.  
  31.  
  32. return 0;
  33. }
  34.  

Espero haberlo aclarado.
Hay muchos mas y mejores ejemplos por Internet.
Busque acción, referencia y punteros....
Suerte!


Título: Re: como regreso mas de un variable de una funcion con un apuntador??
Publicado por: patilanz en 28 Febrero 2014, 11:15 am
Hola vangodp lo que has dicho es devolver? Guarda los valores en las variables pero el sentido de que la función devuelve algo se pierde aunque si devuelve un resultado. Bueno pero se puede utilizar igual.
También se puede utilizar una clase que guarde los dos resultados y se devuelva así se puede devolver con return;
Pero creo que lo que has dicho es mejor.


Título: Re: como regreso mas de un variable de una funcion con un apuntador??
Publicado por: eferion en 28 Febrero 2014, 11:44 am
Código
  1. int* func( )
  2. {
  3.  int* to_return = (int*)malloc( 2 * sizeof( int ) );
  4.  
  5.  to_return[ 0 ] = 1;
  6.  to_return[ 1 ] = 2;
  7.  
  8.  free( to_return );
  9. }
  10.  
  11. void main( );
  12. {
  13.  int* valores = func( );
  14.  
  15.  printf( "%d %d\n", valores[ 0 ], valores[ 1 ] );
  16. }

Con estructuras queda más elegante

Código
  1. typedef struct
  2. {
  3.  int* valores;
  4.  int numValores;
  5. } Vector;
  6.  
  7. Vector CrearVector( int numValores )
  8. {
  9.  Vector to_return;
  10.  to_return.numValores = numValores;
  11.  to_return.valores = (int*)calloc( 2 * sizeof( int ) );
  12.  return to_return;
  13. }
  14.  
  15. void EliminarVector( Vector* vector )
  16. {
  17.  free( vector->valores );
  18.  vector->numValores = 0;
  19. }
  20.  
  21. Vector func( )
  22. {
  23.  Vector to_return = CrearVector( 2 );
  24.  
  25.  to_return.valores[ 0 ] = 1;
  26.  to_return.valores[ 1 ] = 2;
  27.  
  28.  return to_return;
  29. }
  30.  
  31. void main( )
  32. {
  33.  Vector vector = func( );
  34.  
  35.  int i;
  36.  for ( i = 0; i < vector.numValores; i++ )
  37.    printf( "%d ", vector.valores[ i ] );
  38.  printf( "\n" );
  39.  
  40.  EliminarVector( &vector );
  41. }


Título: Re: como regreso mas de un variable de una funcion con un apuntador??
Publicado por: patilanz en 28 Febrero 2014, 13:56 pm
Hola yo me refiria a las clases pero una pregunta. Como funciona este codigo:

Código
  1. int* func( )
  2. {
  3.  int* to_return = (int*)malloc( 2 * sizeof( int ) );
  4.  
  5.  to_return[ 0 ] = 1;
  6.  to_return[ 1 ] = 2;
  7.  
  8.  free( to_return );
  9. }

ya que nunca devuelve. Creo que free no devuelve o si?

Saludos


Título: Re: como regreso mas de un variable de una funcion con un apuntador??
Publicado por: rir3760 en 28 Febrero 2014, 14:23 pm
Como funciona este codigo:
Código
  1. int* func( )
  2. {
  3.  int* to_return = (int*)malloc( 2 * sizeof( int ) );
  4.  
  5.  to_return[ 0 ] = 1;
  6.  to_return[ 1 ] = 2;
  7.  
  8.  free( to_return );
  9. }

ya que nunca devuelve. Creo que free no devuelve o si?
Correcto, el tipo de retorno de la función free es void, para solucionarlo solo tienes que sustituir la sentencia "free( to_return );" por "return to_return;".

Un saludo


Título: Re: como regreso mas de un variable de una funcion con un apuntador??
Publicado por: patilanz en 28 Febrero 2014, 18:05 pm
Osea que la función estaba mal o free hace otra cosa aparte de liberar la memoria es que no me entero   ;D


Título: Re: como regreso mas de un variable de una funcion con un apuntador??
Publicado por: vangodp en 28 Febrero 2014, 22:23 pm
free() es una función....hasta aquí no hay novedad XD

cuando llamas a una función lo que distingue a una llamada de la función misma es:
al llamar la función lleva punto y coma y no lleva el cuerpo.


Lo que te quiere decir rir es que la función free(); es así en realidad:

void free(){
    /*BLABLABAL*/
}


Título: Re: como regreso mas de un variable de una funcion con un apuntador??
Publicado por: rir3760 en 1 Marzo 2014, 01:38 am
Osea que la función estaba mal o free hace otra cosa aparte de liberar la memoria
La función esta mal, lo correcto es:
Código
  1. int *func()
  2. {
  3.   int *to_return = (int *) malloc(2 * sizeof(int));
  4.  
  5.   to_return[0] = 1;
  6.   to_return[1] = 2;
  7.  
  8.   return to_return;
  9. }

Un saludo


Título: Re: como regreso mas de un variable de una funcion con un apuntador??
Publicado por: Yoel Alejandro en 2 Marzo 2014, 21:09 pm
Bueno, comentando acerca del free ha debido ser un despiste o lapsus de eferion, pues si desasignas la memoria del arreglo, el mismo ya no será útil  :huh:

Ahora ya no hablando del programa de eferion sino más en general. Sabemos que sobre gustos no hay nada escrito, pero si se permite mi opinión siempre me ha parecido más elegante la solución de pasar parámetros por referencia a la función. De ese modo se pueden realizar modificaciones a los mismos, con el mismo efecto como si la función devolviera varios parámetros de retorno (que no es permitido en C).

Incluso si usaras un estructura, puede pasarse la misma como argumento por referencia de la función, en lugar de devolver la estructura como valor de retorno.

La razón por la que me inclino por esta modalidad es que (y repito es una opinión personal) luce más acorde con la filosofía original de diseño de C. A ver, por ejemplo cuando usas la función estándar fread para leer de un fichero, no obtienes el arreglo de bytes leídos como valor de retorno, ¿verdad? En su lugar, dicho arreglo (un puntero a char) es pasado como argumento de entrada.

El valor de retorno de las funciones debería ser utilizado más bien para indicar si hubo un error en la ejecución de la misma (devuelve -1) o ejecución exitosa (devuelve 0). O en el caso de funciones de E/S como fread para indicar la cantidad de elementos leídos.

Saludos


Título: Re: como regreso mas de un variable de una funcion con un apuntador??
Publicado por: eferion en 3 Marzo 2014, 08:21 am
Hola yo me refiria a las clases pero una pregunta. Como funciona este codigo:

Código
  1. int* func( )
  2. {
  3.  int* to_return = (int*)malloc( 2 * sizeof( int ) );
  4.  
  5.  to_return[ 0 ] = 1;
  6.  to_return[ 1 ] = 2;
  7.  
  8.  free( to_return );
  9. }

ya que nunca devuelve. Creo que free no devuelve o si?

Saludos

Mil perdones... hice el programa sobre la marcha en un descanso que me tomé... mis dedos no iban por el mismo camino que mis pensamientos.


Título: Re: como regreso mas de un variable de una funcion con un apuntador??
Publicado por: Yoel Alejandro en 3 Marzo 2014, 17:17 pm
Es justo lo que había supuesto, un lapsus involuntario ... (también me ha sucedido). No problem!!!