Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: cjordan en 12 Junio 2010, 10:57 am



Título: Bucle finalizado con enter
Publicado por: cjordan en 12 Junio 2010, 10:57 am
Buenos dias!

Me urge mucho resolver este tema!!! Vereis, quiero hacer un bucle infinito en C con un while(), que se finalize cuando el usuario pulse enter. Como puedo hacerlo?


Título: Re: Bucle finalizado con enter
Publicado por: Horricreu en 12 Junio 2010, 13:19 pm
Pero si es infinito no va a poder continuar me parece, pero bueno:

Código
  1. while(1) //o while(TRUE)
  2. {
  3. }
  4.  
  5. getchar();

Saludos :P


Título: Re: Bucle finalizado con enter
Publicado por: cjordan en 12 Junio 2010, 13:23 pm
esa es la cuestion, que el bucle no se pare hasta que el usuario pulse enter. Es decir, que esté pendiente todo el rato de si el usuario teclea algo o no... alguien sabe como?


Título: Re: Bucle finalizado con enter
Publicado por: Horricreu en 12 Junio 2010, 13:26 pm
Código
  1. int a = getchar();
  2.  
  3. if(!a)
  4. {
  5. while(1);
  6. }

Saludos :P


Título: Re: Bucle finalizado con enter
Publicado por: O-LLOS-O en 12 Junio 2010, 13:47 pm
me podrias explicar pq funciona eso?? o alguien xdxd, no lo entiendo.

lo he hido variando para intentar averiguar-lo pero no lo entiendo.


Código
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int a = cin.get();
  5.  
  6. int main(){
  7.  cout << "hoa" << endl;
  8.  if(!a) {
  9.    while(1){
  10.      cout << "hola" << endl;
  11.    }
  12.  }
  13. }

Una de las variaciones es esta, no entiendo pq no sale "hoa", hasta que se aprete enter, igual que nunca sale "hola".


Mercy


Título: Re: Bucle finalizado con enter
Publicado por: [D4N93R] en 12 Junio 2010, 15:22 pm
Bueno que me acabo de despertar y no entendí lo que querias, debe ser algo así, sino explicamelo de nuevo que ahora me tomo un café.

Código
  1. #include "stdafx.h"
  2.  
  3.  
  4. int main()
  5. {
  6. while(getchar())
  7. {
  8. printf("test\n");
  9. }
  10. return 0;
  11. }


Título: Re: Bucle finalizado con enter
Publicado por: Littlehorse en 12 Junio 2010, 17:42 pm
Citar
Código
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int a = cin.get();
  5.  
  6. int main(){
  7.  cout << "hoa" << endl;
  8.  if(!a) {
  9.    while(1){
  10.      cout << "hola" << endl;
  11.    }
  12.  }
  13. }
Una de las variaciones es esta, no entiendo pq no sale "hoa", hasta que se aprete enter, igual que nunca sale "hola".

Porque usando cin.get de esa forma, incluso si pones un 0, el valor del entero no sera 0, si no 48. Por lo tanto nunca cumplís la condición del if.

Citar
Código
  1. int a = getchar();
  2.  
  3. if(!a)
  4. {
  5. while(1); // faltaba ";"
  6. }

Sucede lo mismo que en el código anterior.

Citar
Código
  1.  
  2. #include "stdafx.h"//No se necesita el header precompilado en este caso
  3.  
  4. int main()
  5. {
  6. while(getchar())
  7. {
  8. printf("test\n");
  9. }
  10. return 0;
  11. }
  12.  

Eso es mas bien lo contrario. Imprimirías test solo si se presiona enter, incluso si presionas varios caracteres y luego enter, se imprimirá tantas veces como datos queden en el buffer de entrada.

Citar
Me urge mucho resolver este tema!!! Vereis, quiero hacer un bucle infinito en C con un while(), que se finalize cuando el usuario pulse enter. Como puedo hacerlo?

Para hacer lo que quieres hacer, necesitas usar funciones especificas de cada sistema, por lo tanto, primero tienes que aclarar en que sistema estas trabajando. Igualmente en el foro hay varios ejemplos que te pueden servir.

Saludos


Título: Re: Bucle finalizado con enter
Publicado por: [D4N93R] en 12 Junio 2010, 19:59 pm
Yo todavía no entiendo lo que el quiere. O sea, que el ciclo siga corriendo ininterrumpidamente hasta que se presione una tecla?, creo que hay que usar un thread no?


Título: Re: Bucle finalizado con enter
Publicado por: Debci en 12 Junio 2010, 20:14 pm
Me temo que hay que usar threads y ser algo asi:
Arrancar el thread con el bucle.
En el thread main del codigo esperar una tecla, si se cumple matar el thread del bucle secundario.

Saludos


Título: Re: Bucle finalizado con enter
Publicado por: [D4N93R] en 12 Junio 2010, 20:26 pm
Me temo que hay que usar threads y ser algo asi:
Arrancar el thread con el bucle.
En el thread main del codigo esperar una tecla, si se cumple matar el thread del bucle secundario.

Saludos

De las formas que se me ocurren para hacerlo, esa que dices es muy buena..

También se puede hacer con un hook al teclado.. o esuchando los mensajes del sistema.


Título: Re: Bucle finalizado con enter
Publicado por: Littlehorse en 12 Junio 2010, 20:58 pm
Yo todavía no entiendo lo que el quiere. O sea, que el ciclo siga corriendo ininterrumpidamente hasta que se presione una tecla?, creo que hay que usar un thread no?

Podría usarse. Tal vez no sea estrictamente necesario, depende de cual sea la estructura de la aplicacion. De cualquier manera lo primero que hay que saber es sobre que sistema va a trabajar, y de ahí en mas utilizar las funciones especificas de ese sistema. Aunque también es recomendable utilizar alguna librería multi-plataforma como por ejemplo: boost (http://www.boost.org/) que también viene con manejo de threads (http://www.boost.org/doc/libs/1_43_0/doc/html/thread.html) en caso que los necesite.

Saludos!


Título: Re: Bucle finalizado con enter
Publicado por: O-LLOS-O en 12 Junio 2010, 21:52 pm
Citar
Código
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int a = cin.get();
  5.  
  6. int main(){
  7.  cout << "hoa" << endl;
  8.  if(!a) {
  9.    while(1){
  10.      cout << "hola" << endl;
  11.    }
  12.  }
  13. }
Una de las variaciones es esta, no entiendo pq no sale "hoa", hasta que se aprete enter, igual que nunca sale "hola".

Porque usando cin.get de esa forma, incluso si pones un 0, el valor del entero no sera 0, si no 48. Por lo tanto nunca cumplís la condición del if.


MMM pero pq se repite el if... si esta fuera del while :huh:, me siento muyyy tonto xdx

Saludos


Título: Re: Bucle finalizado con enter
Publicado por: bizco en 12 Junio 2010, 22:09 pm
el if no se repite, pero al entrar al bucle no hay nada que le haga salir y se queda pillado ahi.


Título: Re: Bucle finalizado con enter
Publicado por: Littlehorse en 12 Junio 2010, 22:12 pm
El if no se repite, y al while nunca entra, porque nunca se cumple la condición del if.

Saludos


Título: Re: Bucle finalizado con enter
Publicado por: Riki_89D en 12 Junio 2010, 22:39 pm
Y que tal con:
Código
  1. #include <C:\Dev-Cpp\All.h>
  2.  
  3. using namespace std;
  4.  
  5. int main(void)
  6. {
  7.   while(!GetAsyncKeyState(VK_RETURN))
  8. {
  9.  
  10.  
  11.                                   }
  12.                 return 0;
  13.                 }
  14.  

es eso? el bucle no para asta que se pulsa la tecla ENTER

A mi me funciona perrfectamente ^^

un saludo


Título: Re: Bucle finalizado con enter
Publicado por: Littlehorse en 12 Junio 2010, 23:05 pm
Esa podría ser una solución valida, pero depende si necesita parar el programa en el transcurso del ciclo o da lo mismo si solo puede hacerlo cuando la condición se evalúa. Dependería de lo que quiera hacer dentro del ciclo.
Igualmente ten en cuenta que esa es una función especifica de Windows, y todavía no sabes en que sistema esta trabajando cjordan.

Deberían esperar a que el usuario que inicio el hilo vuelva a postear, así explica un poco mas que es lo que quiere hacer y sobre que sistema.

Saludos


Título: Re: Bucle finalizado con enter
Publicado por: cjordan en 14 Junio 2010, 14:35 pm
Es en Windows con Dev-C++. He encontrado una funcion que se llama kbhit que hace exactamente eso, mirar el buffer del teclado. Funciona perfectamente pero el problema esta en que tengo 3 whiles. Para el primero me funciona bien pero para los 2 siguientes no, ya que el buffer no esta vacio. Ya he hecho fflush(stdin) pero no sirve...


Título: Re: Bucle finalizado con enter
Publicado por: 43H4FH44H45H4CH49H56H45H en 14 Junio 2010, 14:48 pm
Utiliza la API de windows.
No uses Dev-C++.
VC++ seria lo mejor.


Título: Re: Bucle finalizado con enter
Publicado por: Иōҳ en 14 Junio 2010, 15:59 pm
Y que tal con:
Código
  1. #include <C:\Dev-Cpp\All.h>
  2.  
  3. using namespace std;
  4.  
  5. int main(void)
  6. {
  7.   while(!GetAsyncKeyState(VK_RETURN))
  8. {
  9.  
  10.  
  11.                                   }
  12.                 return 0;
  13.                 }
  14.  

es eso? el bucle no para asta que se pulsa la tecla ENTER

A mi me funciona perrfectamente ^^

un saludo


ps si funcionaria...

la verdad no se mucho de C/C++ pero viendo el ejemplo de D4N9ER me parece que pudiera ser asi...

Código:
#include "stdafx.h"
 
 
int main()
{
while(getchar())
{
break;
}
return 0;
}

corriganme si me equivoco :P


Título: Re: Bucle finalizado con enter
Publicado por: O-LLOS-O en 14 Junio 2010, 19:43 pm
El problema de si se puede hacer esta solucionado, el otro problema es que creo que quiero que haya codigo en medio, y cuando se aprete, dando igual dode estes del codigo salgas, con un evento que salga del bucle


Título: Re: Bucle finalizado con enter
Publicado por: [D4N93R] en 14 Junio 2010, 20:13 pm
Sigo votando por un Thread..


Título: Re: Bucle finalizado con enter
Publicado por: O-LLOS-O en 14 Junio 2010, 21:45 pm
Hay alguna manera de cambiar el Program counter?, y asi con un thread cuando se apretara una tecla camviar el program counter al final del  bucle... pero eso es mas de asm.


Título: Re: Bucle finalizado con enter
Publicado por: 43H4FH44H45H4CH49H56H45H en 15 Junio 2010, 16:09 pm
Es en Windows con Dev-C++. He encontrado una funcion que se llama kbhit que hace exactamente eso, mirar el buffer del teclado. Funciona perfectamente pero el problema esta en que tengo 3 whiles. Para el primero me funciona bien pero para los 2 siguientes no, ya que el buffer no esta vacio. Ya he hecho fflush(stdin) pero no sirve...

De pasada puede ser asi:

Código
  1. #include <stdio.h>
  2. #include <windows.h>
  3. int main()
  4. {
  5. int i = 0;
  6. while (i<1)
  7. {
  8. if(GetAsyncKeyState(13)) i++;
  9. printf("\n Bucle 1 %i", i);
  10. Sleep(100);
  11. }
  12. while (i<2)
  13. {
  14. if(GetAsyncKeyState(13)) i++;
  15. printf("\n Bucle 2 %i", i);
  16. Sleep(100);
  17. }
  18. while (i<3)
  19. {
  20. if(GetAsyncKeyState(13)) i++;
  21. printf("\n Bucle 3 %i", i);
  22. Sleep(100);
  23. }
  24. MessageBox(0, L"Terminado", L"Terminado",MB_OK | MB_ICONSTOP);
  25. return 0;
  26. }

A no ser que necesites que los 3 se inicien al mismo tiempo.
Si te decides que sea multiplataforma te recomiendo Qt4

Código
  1. protected:
  2. void keyPressEvent(QKeyEvent * event);

En los proyectos con GUI funciona muy bien.


Título: Re: Bucle finalizado con enter
Publicado por: Иōҳ en 16 Junio 2010, 01:17 am
Sigo votando por un Thread..
te apoyo !!!

un Thread :)


Título: Re: Bucle finalizado con enter
Publicado por: robanyh en 18 Febrero 2012, 18:19 pm
Hola! En mi opinión no vale la pena que te pongas con threads. He leido el post y esto te podría valer,supongo qe ya tienes el main... jeje, mira:

int control=1;
while(control)
{
     //source code
    if(kbhit()) //si detectamos evento de tecldo
   {
       control=0;
      setbuf( stdin, NULL ); //vaciamos el buffer
   }
}

kbhit no esta implementada en GNU/linux, tengo por aqui el codigo de la implementación de la funcion para linux por si te interesa.


Título: Re: Bucle finalizado con enter
Publicado por: Akai en 18 Febrero 2012, 18:23 pm
Has mirado la fecha del ultimo post del tema?

2 AÑOS

No hagas necro-posting, anda