Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Puntoinfinito en 23 Julio 2012, 00:04 am



Título: Pregunta noob: ¿Pause o no pause? C++
Publicado por: Puntoinfinito en 23 Julio 2012, 00:04 am
Buenas a tod@s.

Veamos, estoy siguiendo los videotutoriales de Jesus Conde de programación C++. En sus VT trabaja en Microsoft Visual C++ 2006, algo antiguo... Pero ese no es el problema. Ese esta en que al compilar el siguiente código:

Código
  1. // videotutorial 2 - usar la palabra clave namespace
  2. #include <iostream>
  3. int main()
  4. {
  5.    using namespace std; // usamos namespace
  6. /* Ejemplo de comentarios
  7. multilínea. Podemos escribir
  8. en varias líneas que no compilará
  9. hasta que encuentre el símbolo de cierre
  10. */
  11.  
  12.    cout << "Hola ah\xd6.\n";
  13.    cout << "\x90ste es un 5: " << 5 << "\n";
  14.    cout << "El manipulador std::endl ";
  15.    cout << "escribe una nueva l\xd6nea a la pantalla.";
  16.    cout <<  endl;
  17.    cout << "Aqu\xd6 vemos un n\xa3mero muy grande:\t" << 70000;
  18.    cout <<  endl;
  19.    cout << "\x90sta es la suma de 8 y 5:\t";
  20.    cout << 8+5 << endl;
  21.    cout << "\x90sta es una fracci\xa2n:\t\t";
  22.    cout << (float) 5/8 << endl;
  23.    cout << "y un n\xa3mero muy, muy grande:\t";
  24.    cout << (double) 7000 * 7000 << endl;
  25.    cout << "Aqu\xd6 puedes colocar";
  26.    cout << "tu nombre...\n";
  27.    cout << "\xadJuan Nadie es un programador C++!\n";
  28.    return 0;
  29. }

Y abrirlo una vez generado, le sale una terminal win32, con el código 100%  escrito correctamente, pero con un "pause" (en lo que sería batch) añadido. En cambio a mi, si lo ejecuto, se abre el código, se imprimen los caracteres y se cierra sin dejar tiempo para poder leer. Supongo que seria causa del malor int main() y tendré que guardar como variable y incorporarla dentro de main(...) .

O no, no se mucho de esto xD...

¡Ayuda expertos!


Título: Re: Pregunta noob: ¿Pause o no pause? C++
Publicado por: DickGumshoe en 23 Julio 2012, 00:10 am
¡Hola!

Efectivamente, necesitas hacer una pausa. Si el creador de ese videotutorial compila directamente desde cmd, es normal que no le haga falta pausar el programa.

Una solución es poner getchar() al final del código.

Si has usado justo antes scanf() u otra función que deje basura en el buffer del teclado, necesitarás poner dos veces getchar(). Así, el primer getchar() eliminaría la basura del buffer y el segundo pedirá un carácter, pausando así el programa.

Una mala solución es poner system("pause"), incluido en stdlib.h. Este no es portable; solo funciona en Windows, por lo que no te aconsejo usarlo, a pesar de que es muy usado por internet.

Saludos!


Título: Re: Pregunta noob: ¿Pause o no pause? C++
Publicado por: rir3760 en 23 Julio 2012, 01:21 am
El problema se debe al IDE (entorno de desarrollo integrado) que estas utilizando. La gran mayoría de estos como Lcc-win32, Pelles C, CodeBlocks, Visual Studio, etc. generan esa pausa de forma automática, lo correcto ya que siendo estrictos no forma parte del programa.

Unos pocos IDEs (en este momento solo recuerdo a Dev-C++) no la generan. Para evitar llenar de pausas los programas (que para empezar no son necesarias) me parece mejor cambiar a otro.

Un saludo


Título: Re: Pregunta noob: ¿Pause o no pause? C++
Publicado por: DickGumshoe en 23 Julio 2012, 01:28 am
Esa pausa que tienen muchos IDEs están bien cuando siempre vas a ejecutar el programa directamente desde éste. Pero si lo que haces es ejecutar el .exe, la pausa no la genera, así que yo siempre uso getchar(), que sí hace la pausa en el .exe generado.

¡Saludos!


Título: Re: Pregunta noob: ¿Pause o no pause? C++
Publicado por: Puntoinfinito en 23 Julio 2012, 14:11 pm
Aja, pude resolverlo. La cuestión era poner :

Código
  1. #include <iostream>
  2. #include <stdio.h> //Añadir esta
  3. int main()
  4. {
  5. ...
  6. getchar()
  7. return 0;
  8. }

Y si aparece en el .exe generado. Gracias

Saludos cracks


Título: Re: Pregunta noob: ¿Pause o no pause? C++
Publicado por: DickGumshoe en 23 Julio 2012, 14:13 pm
Si estás en C++ no te será necesario incluir stdio.h para usar getchar(), puedes poner cin.get(), que es el equivalente a getchar() en C++.

Saludos!


Título: Re: Pregunta noob: ¿Pause o no pause? C++
Publicado por: Puntoinfinito en 23 Julio 2012, 14:25 pm
Los dos de maravilla. ¡Anotados!

Gracias expertos, y saludos.


Título: Re: Pregunta noob: ¿Pause o no pause? C++
Publicado por: Puntoinfinito en 27 Julio 2012, 13:03 pm
Expertos xD

Teóricamente esto ha de hacer pausa, pero ahora el compil no me hace caso...

Código
  1. #include <iostream>
  2. #include <stdio.h>
  3.  
  4. int add(int uno,int dos)
  5. {
  6. using std::cout;
  7. cout << "\nLa suma de " << uno << " y " << dos << " es ";
  8. return (uno + dos);
  9. }
  10.  
  11. int main()
  12. {
  13. using namespace std;
  14. cout << "Ponga los dos numeros que quiere sumar\n";
  15. int a,b,c;
  16. cout << ">>> ";
  17. cin >> a;
  18. cout << "\n>>> ";
  19. cin >> b;
  20. c=add(a,b);
  21. cout << c;
  22. getchar();
  23. return 0;
  24. }

Lo he probado de poner a todos los sitios donde creo que se podría colocar... pero nain...


Título: Re: Pregunta noob: ¿Pause o no pause? C++
Publicado por: avesudra en 27 Julio 2012, 13:26 pm
¿Y si usas el "getchar" de C++?
Código
  1. cin.peek();
PD:No se seguro si es ese eh...Es que ahora mismo no puedo probarlo.


Título: Re: Pregunta noob: ¿Pause o no pause? C++
Publicado por: rir3760 en 27 Julio 2012, 17:16 pm
El problema es el siguiente, al pedir el numero tecleas:
Código:
123{ENTER}

Los caracteres "123" se toman para obtener el numero 123 pero el avance de linea '\n' se queda en el bufer de la entrada estándar. Cuando al final del programa llamas a la función "getchar" esta lee ese carácter, retorna de inmediato y el efecto es no tener la mentada pausa.

Por ello debes descartar el resto de la linea, en C++ hay varias opciones políticamente correctas, la mas sencilla es utilizando un bucle:
Código
  1. // Descartamos el resto de la linea
  2. char ch;
  3. while (cin.get(ch) && ch != '\n')
  4.   ;
  5. // Pausa mediante la lectura de un caracter
  6. cin.get(ch);

Un saludo


Título: Re: Pregunta noob: ¿Pause o no pause? C++
Publicado por: anonimo12121 en 27 Julio 2012, 17:42 pm
cin.get() for paused


Título: Re: Pregunta noob: ¿Pause o no pause? C++
Publicado por: X3R4CK3R en 6 Agosto 2012, 02:38 am
Es más práctico sincronizar el buffer con la entrada de caracteres.

Código
  1. cin.sync(); // Descarta los caracteres no leídos
  2. cin.get(); // Pausa

http://www.cplusplus.com/reference/iostream/istream/sync/

Saludos


Título: Re: Pregunta noob: ¿Pause o no pause? C++
Publicado por: тαптяα en 6 Agosto 2012, 10:11 am
Es más práctico sincronizar el buffer con la entrada de caracteres.

Código
  1. cin.sync(); // Descarta los caracteres no leídos
  2. cin.get(); // Pausa

http://www.cplusplus.com/reference/iostream/istream/sync/

Saludos
++


Título: Re: Pregunta noob: ¿Pause o no pause? C++
Publicado por: Puntoinfinito en 8 Agosto 2012, 18:04 pm
Mirad...

vGiwmHHhQ48

También he probado dejando un espacio antes del pause, pero nada:

Código:
#include <iostream>

using namespace std;

//Calculador de areas by Puntoinfinito 08/08/12 16:22

int main()
{
    unsigned short int ancho, alto, area;
    cout << "Ancho de figura >>> ";
    cin >> ancho;
    cout << "Alto de figura >>> ";
    cin >> alto;
    area = (alto*ancho);
    cout << "La area de la figura es : " << area << endl;
    cin.get();
    return 0;
}

<< endl;*

Que está pasando o.O

Saludos


Título: Re: Pregunta noob: ¿Pause o no pause? C++
Publicado por: X3R4CK3R en 8 Agosto 2012, 19:24 pm
Usa cin.sync() antes del cin.get(), como ya te dije en mi anterior comentario.

Saludos