Test Foro de elhacker.net SMF 2.1

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:

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 (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

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