Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Orden De Prioridades

Iniciado por J_F_NASH, 14 de Octubre de 2003, 09:51:14 AM

« anterior - próximo »

J_F_NASH

 struct Personajes
{
// enum eMoral {Muy_Baja, Baja, Normal, Alta, Muy_Alta, Extra};
int Vida;
int Experiencia;
};

void main()
{
 system("cls");
 Personajes Pepe, Miguel, Federiko;
 char personaje[100];

 //Pepe
 Pepe.Vida = 80;
// Pepe.eMoral = Baja;
 Pepe.Experiencia = 15;

 //Miguel
 Miguel.Vida = 85;
// Miguel.eMoral = Media;
 Miguel.Experiencia = 25;

 //Federiko
 Federiko.Vida = 90;
// Federiko.eMoral = Muy_Alta;
 Federiko.Experiencia = 90;

 cout << "Que personaje deseas ver? (Federiko/Pepe/Miguel): " << endl;
 gets(personaje);

 if (strcmp (personaje, "Pepe")==0)
 {
  cout << "Vida: " << Pepe.Vida << endl;
                                               cout << "Intro para finalizar la aplicacion\n";  //ESTE ES EL PROBLEMA
  getch();
 }
                             .
                             .
                             .


Mi problema es esta linea:
{
  cout << "Vida: " << Pepe.Vida << endl;
                                               cout << "Intro para finalizar la aplicacion\n";
  getch();
 }




Si, bueno, ya se que strcmp es para cadenas (olvidaos de eso ¿ok?  :P ):

El caso es que el orden de representación en pantalla es el siguiente:
1º) Pepe.Vida
2º) getch();
3º) cout << "Intro para finalizar la aplicacion\n";

Pero yo no le he dado ese orden. Quiero que me represente primero Pepe.Vida y luego la frase "Intro para finalizar la aplicacion" y finalmente espere la entrada de teclado.
¿Qué es lo que paso por alto?. ¿Por qué se salta la frase?


S2.

Mars Attacks

 Tengo la vaga sensación de déjà-vû de que en alguna práctica en segundo me ocurriera algo parecido con un getch(); al final del todo. No recuerdo qué hice exactamente, me parece que añadí que imprimiera una línea en blanco antes del getch() y otra después (para depurar a ver qué pasaba) y como me la imprimía y tampoco quedaba mal, lo dejé así.
Prueba a ver (solución tope técnica).

Zaelsius

 Prueba a sustituir getch() por cin.get ()

J_F_NASH

Cita de: "ZaelSiuS"Prueba a sustituir getch() por cin.get ()
¡Funciona!. Pero no logro entender porque pasa eso con getch().


S2.

Zaelsius

 Eso es pq Getch() es una funcion de C(stdio.h) y cin.get() es C++(iostream.h).
(Algo así como cout  y printf)

Deben utilizar buffers de E/S distintos o alguna movida por el estilo. Lo mejor es no mezclar funciones de estas dos librerias siempre que sea posible.

DraKKaR

 Creo que para que hubiese ido con getch() tendrías que haber metido algun fflush() por ahí.

synchrnzr

 El problema que tienes creo que se debe a que las funciones que trabajan con streams son asíncronas. Con cout << "Intro para finalizar la aplicacion\n" envías la cadena al stream de la consola. Una vez está enviada (que no imprimida en pantalla) el programa se sigue ejecutando. Entonces es cuando engancha el getch() antes de imprimir nada. Y antes de acabar el programa lo imprime, porque los destructores de los streams fuezan que éstos se vacien antes de salir. Si pones un cin.get() en vez de getch, el stream está ocupado hasta que se imprime el mensaje por pantalla y en cuanto está libre se realiza el cin.get()

Los streams tienen su utilidad en el marco en que están pensados, es decir, para flujo de datos (por ejemplo, a/desde un fichero o a través de la red) Los streams de consola no los veo nada útiles, pero si los utilizas teniendo en cuenta esta precaución de no interferir las llamadas a streams con otras funciones no tampoco tendrás problemas :)

sync

PD: Lo del flush() me parece que sería más bien para evitar que después de leer una pulsación "Enter" con un getch() no se lea el segundo carácter del retorno de carro con un scanf() o algo parecido...

Mars Attacks

 Fflush era para forzar a vaciar los canales de E/S, o al menos es lo que ponía en el libro de C/C++ de clase. Que pruebe y nos lo diga :)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.