Ejecutar programas en Windows sin necesidad de pausas (system (pause) etc)

Iniciado por Akai, 5 Octubre 2010, 12:20 PM

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

Akai

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



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



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.






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:




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




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:




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:





y el resultado de la ejecución es:




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 (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
using namespace std;

class pila{

struct node{
   int num;
   struct node *seg;
   };

node * cap;

public:
   pila();
   ~pila();
   void push(int num);
   int pop();
   int top() const;
   bool buidap() const;
   pila & operator << (const int num);
};


pila::pila(){
   cap=0;
}

pila::~pila(){
   while(cap){
   node *aux=cap;
   cap=cap->seg;
   delete aux;
   }
}

bool pila::buidap() const{
return (!cap);
}

int pila::top() const{
   if(!buidap())
       return cap->num;
   else return -666;
}

int pila::pop(){
   if(cap){
       node *aux=cap;
       cap=cap->seg;
       int numaux=aux->num;
       delete aux;
       return numaux;
   }
   else return -666;
}

void pila::push(int n){
   node *nou;
   nou=new node;
   nou->num=n;
   nou->seg=cap;
   cap=nou;

}

pila & pila::operator << (const int num){
push(num);
return *this;}

int main(){
   pila p1;
   int num;
   ifstream fitx;
   fitx.open("class_pila.txt");

   if(!fitx){
       cerr << "error al abrir el fichero" << endl;
       return -1;}

   while(fitx >> num){
   cout << num << endl;
   //p1.push(num);
   p1 << num;
   }

   if(!p1.buidap())
       cout << "pila con elementos" << endl;

   while(!p1.buidap()){
   cout << p1.pop() << endl;
   }

   if(p1.buidap())
       cout << "WARNING: pila vacia" << endl;

   fitx.close();
   return 0;
}


class_pila2.cpp
Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
using namespace std;

class pila{

struct node{
   int num;
   struct node *seg;
   };

node * cap;

public:
   pila();
   ~pila();
   void push(int num);
   int pop();
   int top() const;
   bool buidap() const;
   pila & operator << (const int num);
};


pila::pila(){
   cap=0;
}

pila::~pila(){
   while(cap){
   node *aux=cap;
   cap=cap->seg;
   delete aux;
   }
}

bool pila::buidap() const{
return (!cap);
}

int pila::top() const{
   if(!buidap())
       return cap->num;
   else return -666;
}

int pila::pop(){
   if(cap){
       node *aux=cap;
       cap=cap->seg;
       int numaux=aux->num;
       delete aux;
       return numaux;
   }
   else return -666;
}

void pila::push(int n){
   node *nou;
   nou=new node;
   nou->num=n;
   nou->seg=cap;
   cap=nou;

}

pila & pila::operator << (const int num){
push(num);
return *this;}

int main(int argc, char **argv){
   pila p1;
   int num;
   ifstream fitx;
   fitx.open(argv[1]);

   if(!fitx){
       cerr << "error opertura fitxer" << endl;
       return -1;}

   while(fitx >> num){
   cout << num << endl;
   //p1.push(num);
   p1 << num;
   }

   if(!p1.buidap())
       cerr << "pila amb elements" << endl;

   while(!p1.buidap()){
   cout << p1.pop() << endl;
   }

   if(p1.buidap())
       cerr << "WARNING: pila buida" << endl;

   fitx.close();
   return 0;
}


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


Garfield07

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


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

flony

si es verdad los que salimos del bat se nos hace dificil si no tenemos pause....para ver q esta haciendo el code
si un problema no tiene solucion entonces no es un problema...es algo inevitable