Duda: Programa devolviendo valor a otro programa

Iniciado por erest0r, 2 Julio 2015, 19:17 PM

0 Miembros y 1 Visitante están viendo este tema.

erest0r

Hola, me he puesto a probar en crear un programa recibiendo valor de otro programa, este es el pequeño ejemplo:

Primer programa:
uno.cpp -> g++ -o uno.out uno.cpp

int main()
{
    return 20;
}


Segundo programa:
dos.cpp -> g++ -o dos.out dos.cpp
Código (cpp) [Seleccionar]

#include <iostream>
#include <cstdlib>

int main() {
    int resultado = system("./uno.out");
    std::cout << resultado;

    return 0;
}


En este caso, cuando ejecuto dos.out mi salida es de 5120 (no se que resultado les arroje a uds), y si coloco otro valor de retorno en uno.cpp, devuelve un valor distinto. ¿Alguien me puede explicar?

Gracias.
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

ivancea96

#1
Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;

int main(int argc, char** args){
   if(argc>1)
       return 666;
   system("pause");
   cout << system("a.exe a") << endl;
   system("pause");
}


En Windows, funciona correctamente. Tal vez sea coisa de Linux.

Edito: Echa una ojeada a http://linux.die.net/man/3/system.

user-marcos

Código (cpp) [Seleccionar]

#include <iostream>
#include <cstdlib>
#include <fstream>

int main() {
   
    system("./uno.out >a.txt");
    ifstream f ("a.txt");
    string s;
    getline(f,s);
    const char * c = s.c_str();
    int resultado = atoi(c);
    std::cout << resultado;

    return 0;
}

erest0r

Quizas sea el linux, estoy usando ubuntu 14.04 LTS, el codigo de ivancea igualmente me arroja numero distinto al que supuestamente deberia retornar en el codigo, y el es user-marcos  arroja 0, incluso pasando std::ifstream::in en el constructor.
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

user-marcos

Correcto:
con esto de aquí, se redirige el flujo de salida (por terminal), hacía a.txt
Código (cpp) [Seleccionar]

system("./uno.out >a.txt");


Una opción un poco chapucera sería:
Código (cpp) [Seleccionar]

#include <iostream>
int main()
{
std::cout << 20;
}


Código (cpp) [Seleccionar]

#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
int main() {
 
    ifstream f ("a.txt");
    system("./uno.out > a.txt");   
    string s;
    getline(f,s);
    const char * c = s.c_str();
    int resultado = atoi(c);
    cout << resultado;
    return 0;
}

ivancea96

#5
http://stackoverflow.com/questions/14222172/detecting-meaning-of-system-functions-return-value-in-linux

Busca por ahí.

EDITO: Tras probar en Linux...

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>

using namespace std;

int main(int argc, char** args){
   if(argc>1)
       return 200;
   cin.get();
   int ret = system("./a.exe a");
   cout << WEXITSTATUS(ret) << endl;
   cin.get();
}


WEXITSTATUS es un macro que recoge el estado del programa. El límite es de 0 a 255 incluído.

Hay otros macros que recogen otras posibilidades, y los puedes ver en el link que puse en el segundo mensaje.

erest0r

Gracias a ambos por la ayuda, el WEXITSTATUS si me sirvio. Buscando como referencia ese macro encontre este link con otros macros por si alguna otra persona esta interesada tambien: http://www.gnu.org/software/libc/manual/html_node/Process-Completion-Status.html
Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.