Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Akai en 5 Octubre 2010, 12:20 pm



Título: Ejecutar programas en Windows sin necesidad de pausas (system (pause) etc)
Publicado por: Akai en 5 Octubre 2010, 12:20 pm
[El código de los dos programas usados en este pequeño tutorial se encuentran al final del post [codi]]

Para muchos se que no estoy contando nada nuevo, pero el motivo de este post es sobretodo para gente que empieza a programar, especialmente para aquellos que creen necesitar agún tipo de pausa al ejecturar programas para ver resultados (system(pause), getchar, getch etc).

Para este problema se nos plantean, entre otras, dos soluciones:
  • Compilar/ejecutar el programa con Code::Blocks [cdbl]
  • Ejecutar el programa una vez compilado vía la consola de windows [cmdw]

Vía Code::Blocks [cdbl]

Code::Blocks es un IDE (entorno de desarrollo) con compilador (podemos elegir qué compilador usar),  open source, cross plataform y gratuito. Una de sus muchas ventajas, es que cuando compilamos y ejecutamos un programa en este IDE, el propio entorno retiene la ventana mostrando el return y el tiempo empleado en la ejecución del programa (tiempo total, no sólo de ejecución de instrucciones, cuenta también el tiempo que tardamos en introducir datos vía scanf, cin y demás instrucciones que nos soliciten que pulsemos algo).

Dado que esto no es un manual de como usar Code::Blocks, me centraré en la compilación y ejecución con este entorno. Supongamos que tenemos ya un programa creado en Code::Blocks:

(http://img826.imageshack.us/img826/7480/code1.th.jpg) (http://img826.imageshack.us/i/code1.jpg/)

El recuadro rojo señala donde debemos hacer click para compilar y/o ejecutar nuestro programa. En la siguiente imagen muestro como hacer lo mismo vía el menú "Build".

(http://img192.imageshack.us/img192/2830/code2.th.jpg) (http://img192.imageshack.us/i/code2.jpg/)

El resultado de ambas es la siguiente, donde vemos que el programa se ha ejecutado, nos ha dado unos resultados y Code::Blocks lo ha detenido.

(http://img32.imageshack.us/img32/802/code3e.th.jpg) (http://img32.imageshack.us/i/code3e.jpg/)




Vía consola de windows [cmdw]

Otra solución reside en ejecutar los programas vía el cmd de Windows. A diferencia de si hiciésemos doble click en el programa ya compilado (que abriría una ventana y la cerraría inmediatamente después de su uso) ejecutarlo de esta forma permite visualizar los textos, resultados etc que el programa imprima por pantalla sin que desaparezca en un instante. Procedo a explicar como:

Asumamos que ya tenemos nuestro programa compilado y deseamos probarlo. Para ello, vamos al menú inicio y buscamos cmd:

(http://img405.imageshack.us/img405/3556/cmd1.th.jpg) (http://img405.imageshack.us/i/cmd1.jpg/)


Le damos a Enter y nos aparecerá una ventana similar a esta:

(http://img839.imageshack.us/img839/2897/cmd2d.th.jpg) (http://img839.imageshack.us/i/cmd2d.jpg/)


En principio la ruta en la que nos encontramos es la de nuestro usuario, pudiendonos mover de directorio con el comando cd y obtener el contenido de un directorio con el comando dir:

(http://img101.imageshack.us/img101/1511/cmd3.th.jpg) (http://img101.imageshack.us/i/cmd3.jpg/)


Una vez nos encontramos en el directorio de nuestro programa, procedemos a ejecutarlo de la siguiente forma:
nombre del programa.extensión argumento 1 argumento 2....

En este caso, el programa recibe un archivo txt como argumento:

(http://img825.imageshack.us/img825/6031/cmd4.th.jpg) (http://img825.imageshack.us/i/cmd4.jpg/)



y el resultado de la ejecución es:

(http://img705.imageshack.us/img705/9159/cmd5.th.jpg) (http://img705.imageshack.us/i/cmd5.jpg/)


Conclusión

Como habréis podido observar, es bastante sencillo ejecutar programas sin necesidad de instrucciones para detenerlos al finalizar, ahorrando instrucciones como system (pause), getchar, getch ( y por ende, NO necesitamos conio.h (como librería obsoleta)).

¿Comentarios, dudas, sugerencias, feedback en general?


[codi]

class_pila.cpp
Código
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. class pila{
  6.  
  7. struct node{
  8.    int num;
  9.    struct node *seg;
  10.    };
  11.  
  12. node * cap;
  13.  
  14. public:
  15.    pila();
  16.    ~pila();
  17.    void push(int num);
  18.    int pop();
  19.    int top() const;
  20.    bool buidap() const;
  21.    pila & operator << (const int num);
  22. };
  23.  
  24.  
  25. pila::pila(){
  26.    cap=0;
  27. }
  28.  
  29. pila::~pila(){
  30.    while(cap){
  31.    node *aux=cap;
  32.    cap=cap->seg;
  33.    delete aux;
  34.    }
  35. }
  36.  
  37. bool pila::buidap() const{
  38. return (!cap);
  39. }
  40.  
  41. int pila::top() const{
  42.    if(!buidap())
  43.        return cap->num;
  44.    else return -666;
  45. }
  46.  
  47. int pila::pop(){
  48.    if(cap){
  49.        node *aux=cap;
  50.        cap=cap->seg;
  51.        int numaux=aux->num;
  52.        delete aux;
  53.        return numaux;
  54.    }
  55.    else return -666;
  56. }
  57.  
  58. void pila::push(int n){
  59.    node *nou;
  60.    nou=new node;
  61.    nou->num=n;
  62.    nou->seg=cap;
  63.    cap=nou;
  64.  
  65. }
  66.  
  67. pila & pila::operator << (const int num){
  68. push(num);
  69. return *this;}
  70.  
  71. int main(){
  72.    pila p1;
  73.    int num;
  74.    ifstream fitx;
  75.    fitx.open("class_pila.txt");
  76.  
  77.    if(!fitx){
  78.        cerr << "error al abrir el fichero" << endl;
  79.        return -1;}
  80.  
  81.    while(fitx >> num){
  82.    cout << num << endl;
  83.    //p1.push(num);
  84.    p1 << num;
  85.    }
  86.  
  87.    if(!p1.buidap())
  88.        cout << "pila con elementos" << endl;
  89.  
  90.    while(!p1.buidap()){
  91.    cout << p1.pop() << endl;
  92.    }
  93.  
  94.    if(p1.buidap())
  95.        cout << "WARNING: pila vacia" << endl;
  96.  
  97.    fitx.close();
  98.    return 0;
  99. }
  100.  

class_pila2.cpp
Código
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. class pila{
  6.  
  7. struct node{
  8.    int num;
  9.    struct node *seg;
  10.    };
  11.  
  12. node * cap;
  13.  
  14. public:
  15.    pila();
  16.    ~pila();
  17.    void push(int num);
  18.    int pop();
  19.    int top() const;
  20.    bool buidap() const;
  21.    pila & operator << (const int num);
  22. };
  23.  
  24.  
  25. pila::pila(){
  26.    cap=0;
  27. }
  28.  
  29. pila::~pila(){
  30.    while(cap){
  31.    node *aux=cap;
  32.    cap=cap->seg;
  33.    delete aux;
  34.    }
  35. }
  36.  
  37. bool pila::buidap() const{
  38. return (!cap);
  39. }
  40.  
  41. int pila::top() const{
  42.    if(!buidap())
  43.        return cap->num;
  44.    else return -666;
  45. }
  46.  
  47. int pila::pop(){
  48.    if(cap){
  49.        node *aux=cap;
  50.        cap=cap->seg;
  51.        int numaux=aux->num;
  52.        delete aux;
  53.        return numaux;
  54.    }
  55.    else return -666;
  56. }
  57.  
  58. void pila::push(int n){
  59.    node *nou;
  60.    nou=new node;
  61.    nou->num=n;
  62.    nou->seg=cap;
  63.    cap=nou;
  64.  
  65. }
  66.  
  67. pila & pila::operator << (const int num){
  68. push(num);
  69. return *this;}
  70.  
  71. int main(int argc, char **argv){
  72.    pila p1;
  73.    int num;
  74.    ifstream fitx;
  75.    fitx.open(argv[1]);
  76.  
  77.    if(!fitx){
  78.        cerr << "error opertura fitxer" << endl;
  79.        return -1;}
  80.  
  81.    while(fitx >> num){
  82.    cout << num << endl;
  83.    //p1.push(num);
  84.    p1 << num;
  85.    }
  86.  
  87.    if(!p1.buidap())
  88.        cerr << "pila amb elements" << endl;
  89.  
  90.    while(!p1.buidap()){
  91.    cout << p1.pop() << endl;
  92.    }
  93.  
  94.    if(p1.buidap())
  95.        cerr << "WARNING: pila buida" << endl;
  96.  
  97.    fitx.close();
  98.    return 0;
  99. }
  100.  

contenido de class_pila.txt:
Código:
1
5
6
7
10
20
50


Título: Re: Ejecutar programas en Windows sin necesidad de pausas (system (pause) etc)
Publicado por: Garfield07 en 5 Octubre 2010, 20:00 pm
Fff por fin un post para que la gente deje de usar conio.h o stdlib.h para system ()... cuando se programa en C no se programa en Batch xD...

Gracias


Título: Re: Ejecutar programas en Windows sin necesidad de pausas (system (pause) etc)
Publicado por: flony en 16 Octubre 2010, 19:18 pm
si es verdad los que salimos del bat se nos hace dificil si no tenemos pause....para ver q esta haciendo el code