Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: javirk en 28 Enero 2012, 17:02 pm



Título: Devolver varias variables en una sola función
Publicado por: javirk en 28 Enero 2012, 17:02 pm
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?


Título: Re: Devolver varias variables en una sola función
Publicado por: x64core en 28 Enero 2012, 18:11 pm
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


Título: Re: Devolver varias variables en una sola función
Publicado por: satu en 28 Enero 2012, 18:18 pm
Hola

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

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. void funcion(int &a, int &b, int &c) // Fijate en los &
  6. {
  7.    cin >> a;
  8.    cin >> b;
  9.    cin >> c;
  10. }
  11.  
  12. int main()
  13. {
  14.    int a = 0, b = 0, c = 0;
  15.    funcion(a, b, c);
  16.    cout << "Los valores de a, b, y c son: " << a << ", " << b << " y " << c;
  17.    cin.get(); //Pausamos el programa
  18.    return 0;
  19. }
  20.  

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


Título: Re: Devolver varias variables en una sola función
Publicado por: x64core en 28 Enero 2012, 18:30 pm
dejo el mio:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. void func1(int* Mylp)
  6. {
  7.    *Mylp = 10; Mylp++;
  8.    *Mylp = 20; Mylp++;
  9.    *Mylp = 50; Mylp++;
  10.    // ...
  11.  
  12. }
  13.  
  14.  
  15. int main()
  16. {
  17.    int DATAs[10] = {0}; // Pointer to data, for store the dates
  18.  
  19.    func1(DATAs);
  20.    cout << DATAs[0] << endl;
  21.    cout << DATAs[1] << endl;
  22.    cout << DATAs[2] << endl;
  23.  
  24. }
  25.  


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

Código:
#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


Título: Re: Devolver varias variables en una sola función
Publicado por: satu en 28 Enero 2012, 18:39 pm
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


Título: Re: Devolver varias variables en una sola función
Publicado por: x64core en 28 Enero 2012, 18:45 pm
@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


Título: Re: Devolver varias variables en una sola función
Publicado por: satu en 28 Enero 2012, 18:48 pm
Toda la razón, así si no sabe sobre punteros le entrarán ganas de saber cómo funcionan.

Saludos


Título: Re: Devolver varias variables en una sola función
Publicado por: Xandrete en 28 Enero 2012, 19:14 pm
También puedes hacer que tu función devuelva una tupla.

Código
  1. struct Result {
  2. int result1;
  3. char result2;
  4. double result3;
  5. };
  6.  
  7. Result foo(int param) {
  8. Result r;
  9. // GENERIC CODE
  10. return r;
  11. }

Saludos


Título: Re: Devolver varias variables en una sola función
Publicado por: x64core 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

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


Título: Re: Devolver varias variables en una sola función
Publicado por: Xandrete en 28 Enero 2012, 19:38 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)


Título: Re: Devolver varias variables en una sola función
Publicado por: eleon en 28 Enero 2012, 19:44 pm
Si no quieres ver punteros se puede hacer paso por referencia puro:

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void funcion (int &sobrenombreVariable) /* Esto se vuelve un "sobrenombre" de la variable, todas las modificiaciones
  5. que hagas en "sobrenombreVariable" se harán en "variable" */
  6. {
  7. sobrenombreVariable = 10;
  8. }
  9.  
  10. int main ()
  11. {
  12. int variable = 0;
  13. funcion (variable); //Le pasamos la variable a la que queremos que afecte el sobrenombre
  14.  
  15. return 0;
  16. }

Busca "paso por referencia" y encontrarás más información. Saludos.


Título: Re: Devolver varias variables en una sola función
Publicado por: x64core en 28 Enero 2012, 19:51 pm
@Xandrete:
cierto, quise decir el retorno de la funcion ya que como dices si la estructura pudiera tener mas de 100 elementos cada elementos va a tener que pasarse a un registro luego hacia la pila por cada elemento lo peor creo que nose si esto lo implementaria el
compilador haciendo un bucle, en el peor de los casos escribia todas las instrucciones y seria mas lento, y bueno compare eso de lento a comparacionde pasarle el puntero de una estructura :P en mi pd3 ( lo publique antes que respondieras a mi pd2 ) igual
esta bien tu codigo Xandrete ;D


Título: Re: Devolver varias variables en una sola función
Publicado por: Xandrete en 28 Enero 2012, 19:57 pm
Si no quieres ver punteros se puede hacer paso por referencia puro:

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void funcion (int &sobrenombreVariable) /* Esto se vuelve un "sobrenombre" de la variable, todas las modificiaciones
  5. que hagas en "sobrenombreVariable" se harán en "variable" */
  6. {
  7. sobrenombreVariable = 10;
  8. }
  9.  
  10. int main ()
  11. {
  12. int variable = 0;
  13. funcion (variable); //Le pasamos la variable a la que queremos que afecte el sobrenombre
  14.  
  15. return 0;
  16. }

Busca "paso por referencia" y encontrarás más información. Saludos.

Correcto. Pero es lo mismo que dijo satu, xD. Se te adelantaron  ;)

¡Saludos!


Título: Re: Devolver varias variables en una sola función
Publicado por: eleon en 28 Enero 2012, 20:24 pm
Ups, no me di cuenta.


Título: Re: Devolver varias variables en una sola función
Publicado por: javirk en 29 Enero 2012, 13:04 pm
Ya lo he conseguido, muchas gracias a todos por vuestra ayuda!


Título: Re: Devolver varias variables en una sola función
Publicado por: qerde en 29 Enero 2012, 18:20 pm
I con vectores?