Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: J_F_NASH en 14 de Octubre de 2003, 09:51:14 AM

Título: Orden De Prioridades
Publicado por: J_F_NASH en 14 de Octubre de 2003, 09:51:14 AM
 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.
Título: Orden De Prioridades
Publicado por: Mars Attacks en 14 de Octubre de 2003, 09:57:21 AM
 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).
Título: Orden De Prioridades
Publicado por: Zaelsius en 14 de Octubre de 2003, 11:03:54 AM
 Prueba a sustituir getch() por cin.get ()
Título: Orden De Prioridades
Publicado por: J_F_NASH en 14 de Octubre de 2003, 05:43:13 PM
Cita de: "ZaelSiuS"Prueba a sustituir getch() por cin.get ()
¡Funciona!. Pero no logro entender porque pasa eso con getch().


S2.
Título: Orden De Prioridades
Publicado por: Zaelsius en 14 de Octubre de 2003, 05:46:27 PM
 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.
Título: Orden De Prioridades
Publicado por: DraKKaR en 14 de Octubre de 2003, 07:50:28 PM
 Creo que para que hubiese ido con getch() tendrías que haber metido algun fflush() por ahí.
Título: Orden De Prioridades
Publicado por: synchrnzr en 14 de Octubre de 2003, 08:18:16 PM
 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...
Título: Orden De Prioridades
Publicado por: Mars Attacks en 14 de Octubre de 2003, 08:39:58 PM
 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 :)