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?
Pero si es infinito no va a poder continuar me parece, pero bueno:
while(1) //o while(TRUE)
{
}
getchar();
Saludos :P
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?
int a = getchar();
if(!a)
{
while(1);
}
Saludos :P
me podrias explicar pq funciona eso?? o alguien xdxd, no lo entiendo.
lo he hido variando para intentar averiguar-lo pero no lo entiendo.
#include<iostream>
using namespace std;
int a = cin.get();
int main(){
cout << "hoa" << endl;
if(!a) {
while(1){
cout << "hola" << endl;
}
}
}
Una de las variaciones es esta, no entiendo pq no sale "hoa", hasta que se aprete enter, igual que nunca sale "hola".
Mercy
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é.
#include "stdafx.h"
int main()
{
while(getchar())
{
printf("test\n");
}
return 0;
}
Citar#include<iostream>
using namespace std;
int a = cin.get();
int main(){
cout << "hoa" << endl;
if(!a) {
while(1){
cout << "hola" << endl;
}
}
}
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
int a = getchar();
if(!a)
{
while(1); // faltaba ";"
}
Sucede lo mismo que en el código anterior.
Citar
#include "stdafx.h"//No se necesita el header precompilado en este caso
int main()
{
while(getchar())
{
printf("test\n");
}
return 0;
}
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
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?
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
Cita de: ..::| D3Bć1 |::. 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
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.
Cita de: 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?
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!
Cita de: Littlehorse en 12 Junio 2010, 17:42 PM
Citar#include<iostream>
using namespace std;
int a = cin.get();
int main(){
cout << "hoa" << endl;
if(!a) {
while(1){
cout << "hola" << endl;
}
}
}
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
el if no se repite, pero al entrar al bucle no hay nada que le haga salir y se queda pillado ahi.
El if no se repite, y al while nunca entra, porque nunca se cumple la condición del if.
Saludos
Y que tal con:
#include <C:\Dev-Cpp\All.h>
using namespace std;
int main(void)
{
while(!GetAsyncKeyState(VK_RETURN))
{
}
return 0;
}
es eso? el bucle no para asta que se pulsa la tecla ENTER
A mi me funciona perrfectamente ^^
un saludo
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
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...
Utiliza la API de windows.
No uses Dev-C++.
VC++ seria lo mejor.
Cita de: Riki_89D en 12 Junio 2010, 22:39 PM
Y que tal con:
#include <C:\Dev-Cpp\All.h>
using namespace std;
int main(void)
{
while(!GetAsyncKeyState(VK_RETURN))
{
}
return 0;
}
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...
#include "stdafx.h"
int main()
{
while(getchar())
{
break;
}
return 0;
}
corriganme si me equivoco :P
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
Sigo votando por un Thread..
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.
Cita de: 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...
De pasada puede ser asi:
#include <stdio.h>
#include <windows.h>
int main()
{
int i = 0;
while (i<1)
{
if(GetAsyncKeyState(13)) i++;
printf("\n Bucle 1 %i", i);
Sleep(100);
}
while (i<2)
{
if(GetAsyncKeyState(13)) i++;
printf("\n Bucle 2 %i", i);
Sleep(100);
}
while (i<3)
{
if(GetAsyncKeyState(13)) i++;
printf("\n Bucle 3 %i", i);
Sleep(100);
}
MessageBox(0, L"Terminado", L"Terminado",MB_OK | MB_ICONSTOP);
return 0;
}
A no ser que necesites que los 3 se inicien al mismo tiempo.
Si te decides que sea multiplataforma te recomiendo Qt4
protected:
void keyPressEvent(QKeyEvent * event);
En los proyectos con GUI funciona muy bien.
Cita de: D4N93R en 14 Junio 2010, 20:13 PM
Sigo votando por un Thread..
te apoyo !!!
un Thread :)
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.
Has mirado la fecha del ultimo post del tema?
2 AÑOS
No hagas necro-posting, anda