Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: djdac3 en 22 Septiembre 2012, 20:23 PM

Título: Duda
Publicado por: djdac3 en 22 Septiembre 2012, 20:23 PM
Alguien me puede decir porque no hace una donde pausa donde debería. (este es solo un pedazo del código)

#include <iostream>
#include <stdlib.h>


using namespace std;

int main()
{
   int mesa;
   for(;;){
       cout<<"Ingrese el mes actual"<<endl;
       cin>>mesa;
       if(mesa>=1 && mesa<=12) break;
           else{
               cout<<"El mes que ingreso no es valido, inrese un dato valido"<<endl;
               cout<<"Presione enter para continuar"<<endl;
               cin.peek();  //Aqui debería haber una pausa pero no lo hay ero no lo hay
system("cls");
            }
        }
   
   system("PAUSE");
    return 0;
}
Título: Re: Duda
Publicado por: тαптяα en 22 Septiembre 2012, 21:00 PM
No entiendo, que no te funciona?

Saludos
Título: Re: Duda
Publicado por: djdac3 en 22 Septiembre 2012, 21:10 PM
en donde esta el cin.peek(); no pausa el programa.
Título: Re: Duda
Publicado por: Stakewinner00 en 22 Septiembre 2012, 21:21 PM
prueab cin.get();
Título: Re: Duda
Publicado por: djdac3 en 22 Septiembre 2012, 21:25 PM
lo mismo, cin.get da lo mismo
Título: Re: Duda
Publicado por: Stakewinner00 en 22 Septiembre 2012, 21:26 PM
Cita de: djdac3 en 22 Septiembre 2012, 21:25 PM
lo mismo, cin.get da lo mismo
entonc3s seran los includes voy a ver
Título: Re: Duda
Publicado por: Stakewinner00 en 22 Septiembre 2012, 21:28 PM
lo acavo de comprovar y ami me va sino prueba a usar system("PAUSE"); como lo tienes mas adelante
Título: Re: Duda
Publicado por: djdac3 en 22 Septiembre 2012, 21:30 PM
con system("PAUSE"); si sirvió, gracias 
Título: Re: Duda
Publicado por: тαптяα en 22 Septiembre 2012, 21:31 PM
no deberías usar llamadas al sistema así

No está mal, pero no te mal acostumbres
Título: Re: Duda
Publicado por: Stakewinner00 en 22 Septiembre 2012, 21:33 PM
Cita de: тαптяαпсє en 22 Septiembre 2012, 21:31 PM
no deberías usar llamadas al sistema así

No está mal, pero no te mal acostumbres

si no le funcionaba lo otro no quedaba otra opcion, eso si tendria que ver por que no funciono.

PD:Vaya gif que tienes тαптяαпсє XD
Título: Re: Duda
Publicado por: Caster en 22 Septiembre 2012, 21:34 PM
He leido eso y no he podido evitar contestar, nunca useis system("PAUSE"), repito nunca, es llamar al sistema para hacer una pausa, como consejo es mejor que eviteis esa pausa, echadle un vistazo a las chinchetas, hay un post que habla sobre esto.
Título: Re: Duda
Publicado por: Stakewinner00 en 22 Septiembre 2012, 21:35 PM
una pregunta, es que como yo aprendo por mi cuenta sin uni pues hay cosas que me salto para que sirve los ;; de

for(;;)

gracias

PD:
Cita de: Caster en 22 Septiembre 2012, 21:34 PM
He leido eso y no he podido evitar contestar, nunca useis system("PAUSE"), repito nunca, es llamar al sistema para hacer una pausa, como consejo es mejor que eviteis esa pausa, echadle un vistazo a las chinchetas, hay un post que habla sobre esto.

por que no se tenia que usar? creo que era por que hacia correr al programa lento y tenia menos compatibilidad
Título: Re: Duda
Publicado por: djdac3 en 22 Septiembre 2012, 21:36 PM
el system("PAUSE"); es el ultimo recurso, ya que probé con cin.peek, cin.ignore, get.char, ninguno me sirvió y no se porque.

los ;; en el for es para que sea un ciclo infinito
Título: Re: Duda
Publicado por: cpu2 en 22 Septiembre 2012, 22:50 PM
Hola

Cita de: djdac3 en 22 Septiembre 2012, 21:36 PM
el system("PAUSE"); es el ultimo recurso, ya que probé con cin.peek, cin.ignore, get.char, ninguno me sirvió y no se porque.

los ;; en el for es para que sea un ciclo infinito

No programo en C++ ni en Windows, para hacer una pausa o "bloquear" la ejecución tienes la función sleep, el tiempo se define en segundos.

Un saludo

P.D: Yo no pondria un for, lo dejaria así:

while (1) {

//codigo

}
Título: Re: Duda
Publicado por: DickGumshoe en 22 Septiembre 2012, 22:59 PM
No se pausa porque con
Código (cpp) [Seleccionar]
cin>>mesa; dejas "basura" en el buffer del teclado, y
Código (cpp) [Seleccionar]
cin.peek(); en este caso lo que hace es limpiar dicho buffer. Para solucionarlo, solo tienes que poner dos veces
Código (cpp) [Seleccionar]
cin.peek(); (u otro similar). El primero limpiará el buffer, y el segundo pausará el programa.

Un saludo.
Título: Re: Duda
Publicado por: Caster en 23 Septiembre 2012, 12:50 PM
Prueba con este:

Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>


using namespace std;

int main()
{
    int mesa;
    for(;;){
        cout<<"Ingrese el mes actual"<<endl;
        cin>>mesa;
        if(mesa>=1 && mesa<=12) break;
            else{
                cout<<"El mes que ingreso no es valido, inrese un dato valido"<<endl;
               cout<<"Presione enter para continuar"<<endl;
               cin.get();
               cin.get();

system("cls");
            }
        }
   
  cin.get();

    return 0;
}
Título: Re: Duda
Publicado por: fary en 23 Septiembre 2012, 13:57 PM
Cita de: cpu2 en 22 Septiembre 2012, 22:50 PM
Hola

No programo en C++ ni en Windows, para hacer una pausa o "bloquear" la ejecución tienes la función sleep, el tiempo se define en segundos.

Un saludo

P.D: Yo no pondria un for, lo dejaria así:

while (1) {

//codigo

}


En code::blocks (y me supongo que mas compiladores) da lo mismo poner una cosa que otra porque genera el mismo código ensamblador:

Con while:

Código (asm) [Seleccionar]

MOV DWORD PTR SS:[ESP+C],0
MOV DWORD PTR SS:[ESP+8],0
MOV DWORD PTR SS:[ESP+4],0
MOV DWORD PTR SS:[ESP],0
CALL <JMP.&USER32.MessageBoxA>
SUB ESP,10
JMP SHORT bucle_wh.0040132E



Con for:

Código (asm) [Seleccionar]

MOV DWORD PTR SS:[ESP+C],0
MOV DWORD PTR SS:[ESP+8],0
MOV DWORD PTR SS:[ESP+4],0
MOV DWORD PTR SS:[ESP],0
CALL <JMP.&USER32.MessageBoxA>
SUB ESP,10
JMP SHORT bucle_wh.0040132E


El equivalente en C

While:

#include <windows.h>

int main()
{
    while(1)
    {
        MessageBoxA(0,0,0,0);
    }

    return 0;
}


for:

#include <windows.h>

int main()
{
    for (;;)
    {
        MessageBoxA(0,0,0,0);
    }

    return 0;
}


saludos!
Título: Re: Duda
Publicado por: cpu2 en 23 Septiembre 2012, 16:25 PM
Hola mDrinky, gracias por el dato, esto me viene bien por que estoy empezando con ASM.

Solo dije eso porque for se suele utiliza para bucles definidos, ya sabes iniciación de la variable, condición, incremento o decremento, por eso me parecio más correcto para un bucle infinito usar while. Como genera lo mismo ya veo que no es importante.

P.D: GCC me genero exactamente lo mismo.

Un saludo
Título: Re: Duda
Publicado por: fary en 23 Septiembre 2012, 18:37 PM
Cita de: cpu2 en 23 Septiembre 2012, 16:25 PM
Hola mDrinky, gracias por el dato, esto me viene bien por que estoy empezando con ASM.

Solo dije eso porque for se suele utiliza para bucles definidos, ya sabes iniciación de la variable, condición, incremento o decremento, por eso me parecio más correcto para un bucle infinito usar while. Como genera lo mismo ya veo que no es importante.

P.D: GCC me genero exactamente lo mismo.

Un saludo

Sí, en realidad casi nadie en C usaría un for para hacer un bucle infinito. De hecho queda asta feo, no?. Pero cosas como estas demuestran que no siempre un código bonito en C pueda funcionar mejor que un código feo  :D

un saludo!