Devolver varias variables en una sola función

Iniciado por javirk, 28 Enero 2012, 17:02 PM

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

javirk

Hola, estoy haciendo un pequeño programa en C++ y me gustaría saber cómo devolver más de una variable en una función. la función lo que hace es recoger tres números que mete el usuario, y me gustaría usar esos tres números en el main. ¿Cómo puedo hacerlo?

x64core

mmm devolver los valores como parametro seria una opcion, *nunca devolver punteros generados dentro de la funcion*
o o bien pasarle a la funcion un puntero de array en donde se desee que se guarden los valores, aver esperemos a alguien
mas a ver que opina

satu

Hola

Pues una forma sería utilizando parámetros por referencia. Te pongo un ejemplo:

Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;

void funcion(int &a, int &b, int &c) // Fijate en los &
{
    cin >> a;
    cin >> b;
    cin >> c;
}

int main()
{
    int a = 0, b = 0, c = 0;
    funcion(a, b, c);
    cout << "Los valores de a, b, y c son: " << a << ", " << b << " y " << c;
    cin.get(); //Pausamos el programa
    return 0;
}


Te recomiendo que cojas un buen libro y te pongas con él, dentro del subforo de C/C++ hay un post con varios libros.

Saludos
Breakbeat como forma de vida

x64core

#3
dejo el mio:


#include <iostream>

using namespace std;

void func1(int* Mylp)
{
   *Mylp = 10; Mylp++;
   *Mylp = 20; Mylp++;
   *Mylp = 50; Mylp++;
   // ...

}


int main()
{
   int DATAs[10] = {0}; // Pointer to data, for store the dates

   func1(DATAs);
   cout << DATAs[0] << endl;
   cout << DATAs[1] << endl;
   cout << DATAs[2] << endl;

}



tambie puede indicarle al compilador que lo que quiere es pasar explicitamente un array de esta forma:


#include <iostream>

using namespace std;

void func1(int Mylp[])
{
   Mylp[0] = 10;
   Mylp[1] = 20;
   Mylp[2] = 50;
   // ...

}


int main()
{
   int DATAs[5] = {0}; // Pointer to data, for store the dates


   func1(DATAs);
   cout << DATAs[0] << endl;
   cout << DATAs[1] << endl;
   cout << DATAs[2] << endl;

}


solamente que el puntero que se le pasa es constante no podemos hacer que apunte a otro lugar y creo que seria mas facil de entender :P igual me gusta mas la primera forma

satu

Hola

RHL tu solución es muy buena pero dada su pregunta no creo que haya llegado aun a los punteros y no se si entenderá tu código.

No te lo tomes a mal, solo digo que quizá no lo entienda, eso es todo.

Saludos
Breakbeat como forma de vida

x64core

@satu: bueno quiza , quien sabe xd
lo importante es que al menos ya tienen dos formas de como hacerlo y aprender esos codigos le sera muy facil
mas cuando ya este en el tema de los punteros ;D

satu

Toda la razón, así si no sabe sobre punteros le entrarán ganas de saber cómo funcionan.

Saludos
Breakbeat como forma de vida

Xandrete

También puedes hacer que tu función devuelva una tupla.

Código (cpp) [Seleccionar]
struct Result {
int result1;
char result2;
double result3;
};

Result foo(int param) {
Result r;
// GENERIC CODE
return r;
}


Saludos

x64core

#8
@Xandrete... :
Al declarar variables dentro de funciones no* se pueden retornar porque las variables son
locales la memoria asignada en ese momento es liberada, despues puede tener otros valores
pd: debe ser un tipo de dato como char, int :P

pd2: creo que si, es legal devolver estructuras :P solamente que es algo lento.. :P
al menos el dato ya lo tienes...

cierto solamente que en tiempo de ejecucion es mas lento que pasar el puntero, a los datos :P

Xandrete

#9
Cita de: RHL en 28 Enero 2012, 19:19 PM
@Xandrete... :
Al declarar variables dentro de funciones no* se pueden retornar porque las variables son
locales la memoria asignada en ese momento es liberada, despues puede tener otros valores
pd: debe ser un tipo de dato como char, int :P

¿Eh? Lo que dices no se aplica al código que yo he propuesto. Esto es algo que he hecho millones de veces, de hecho.

Retornas una copia de esa variable, no un puntero a la variable declarada dentro de la función. Pruébalo y verás que funciona perfectamente (y si compilas con -Wall y -Werror, el compilador no se quejará ni un poquito).

Saludos.

EDITO: Acabo de leer tu PD2. Es totalmente legal, te lo aseguro. ¿Lento? Bueno, en un caso es lento el paso de parámetros, y en otro es lento el retorno de la función. Me explico. Pon que quieres devolver/asignar 100 datos en una función, y que tratas de hacerlo mediante la primera alternativa (la de paso de parámetros por referencia). En ese caso es "lento" el paso de parámetros porque se han de guardar 100 punteros en pila (más parámetros adicionales que hicieran falta en la función). Sin embargo, el retorno es rápido porque no hay nada que devolver. En mi propuesta (usando struct) es rápido el paso de parámetros (porque seguramente no hay que usar ni la pila) pero lento el retorno de la función (porque es ahí cuando hay que recurrir a ella).

EDITO OTRA VEZ: Si tienes algo que replicarme, dale a responder otra vez, no sigas editanto el tuyo, xD (yo lo hago para no poner dos posts seguidos  ;D)