como regreso mas de un variable de una funcion con un apuntador??

Iniciado por hugodavidx, 28 Febrero 2014, 00:12 AM

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

hugodavidx

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

EzianGES

¿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 :)

patilanz


vangodp

#3
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 (cpp) [Seleccionar]

#include <stdio.h>

void accionRef ( int& a, int& b, int& c, int& r1, int& r2 ) { /*Parametros por referencia*/
r1 = a + b;
r2 = c - 13;
}

void accionPunt ( int* a, int* b, int* c, int* r1, int* r2 ) { /*Parametros por puntero*/
*r1 = *a + *b +20;
*r2 = *c - 13 + 112;
}

int main () {
int A = 10;
int B = 30;
int C = 40;
int resultado1 = 0;
int resultado2 = 0;
/*Lamamos a la accion*/
accionRef ( A, B, C, resultado1, resultado2 );

/* resultado1 aqui vale 40 y resultado2 vale 27*/
/*si eso es asi he echo 2 calculos con una accion¿comprobemos?*/

printf ("resultado1: %d\n resultado2: %d\n ", resultado1, resultado2);

/*Ahora volvamos a hacer pero con punteros*/
accionPunt ( &A, &B, &C, &resultado1, &resultado2 );
printf ("resultado1: %d\n resultado2: %d\n ", resultado1, resultado2);


return 0;
}


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

patilanz

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.

eferion


int* func( )
{
  int* to_return = (int*)malloc( 2 * sizeof( int ) );

  to_return[ 0 ] = 1;
  to_return[ 1 ] = 2;

  free( to_return );
}

void main( );
{
  int* valores = func( );

  printf( "%d %d\n", valores[ 0 ], valores[ 1 ] );
}


Con estructuras queda más elegante


typedef struct
{
  int* valores;
  int numValores;
} Vector;

Vector CrearVector( int numValores )
{
  Vector to_return;
  to_return.numValores = numValores;
  to_return.valores = (int*)calloc( 2 * sizeof( int ) );
  return to_return;
}

void EliminarVector( Vector* vector )
{
  free( vector->valores );
  vector->numValores = 0;
}

Vector func( )
{
  Vector to_return = CrearVector( 2 );

  to_return.valores[ 0 ] = 1;
  to_return.valores[ 1 ] = 2;

  return to_return;
}

void main( )
{
  Vector vector = func( );

  int i;
  for ( i = 0; i < vector.numValores; i++ )
    printf( "%d ", vector.valores[ i ] );
  printf( "\n" );

  EliminarVector( &vector );
}

patilanz

Hola yo me refiria a las clases pero una pregunta. Como funciona este codigo:

Código (csharp) [Seleccionar]
int* func( )
{
  int* to_return = (int*)malloc( 2 * sizeof( int ) );

  to_return[ 0 ] = 1;
  to_return[ 1 ] = 2;

  free( to_return );
}


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

Saludos

rir3760

Cita de: patilanz en 28 Febrero 2014, 13:56 PM
Como funciona este codigo:
Código (cpp) [Seleccionar]
int* func( )
{
  int* to_return = (int*)malloc( 2 * sizeof( int ) );

  to_return[ 0 ] = 1;
  to_return[ 1 ] = 2;

  free( to_return );
}


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

patilanz

Osea que la función estaba mal o free hace otra cosa aparte de liberar la memoria es que no me entero   ;D

vangodp

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*/
}