Autor
|
Tema: Duda con el envío encadenado a través de cout en C++ (Leído 6,332 veces)
|
Manu in Motion
Desconectado
Mensajes: 5
|
Hola,
He empezado hace dos semanas a aprender programación con el libro de C/C++ (Edición revisada y actualizada 2012) y Dev-C++ en un Windows 7 y, aunque al principio ninguno de los programas de práctica funcionaba, he ido solucionando los problemas mirando en internet.
El problema es que he llegado a un programa en el que la única solución que he encontrado no me gusta. El programa está en C++ y es el siguiente:
#include <iostream> #define PI 3.14 using namespace std;
int main (void) { int numero = 10;
cout << numero << " es el valor de la variable numero." << '\n'; cout << "La primera letra de KILO es: " << 'K' << '\n'; cout << PI << " es el valor de la constante pi.\n"; cout << "((3+7)*2) = " << ((3+7)*2) << '\n'; cout << "Hola a todos\n"; /* Hacemos una pausa hasta que el usuario pulse Intro */ setbuf(stdin, NULL); cout << "\nPulse Intro para finalizar..."; cin.get(); }
El problema está en la primera línea de cout. Tendría que poner
cout << "La variable numero almacena: " << numero << '\n';
pero puesto así no funciona.
He probado incluso a separar "La variable numero almacena: " y numero en dos líneas de código distintas y en poner la línea de "La variable numero almacena: " antes de declarar la variable numero, pero ninguna de las dos opciones ha dado resultado.
El programa tal y como está escrito entero funciona, pero, aparte de que no me gusta como queda, me gustaría saber por qué no funciona de las otras maneras.
Gracias de antemano.
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Lo primero es recomendarte que no uses DevCpp: http://foro.elhacker.net/programacion_cc/iquestpor_que_no_deberias_usar_el_devcpp-t385150.0.htmlLo segundo: setbuf(stdin, NULL);
Esto no es necesario. Lo tercero esque: cout << numero << " es el valor de la variable numero." << '\n'; cout << "La variable numero almacena: " << numero << '\n';
Ambas funciones son equivalentes y funcionan, asi que ese no es el error. Por cierto yo pondría endl en vez \n: cout << "La variable numero almacena: " << numero << endl;
Aunque el efecto es el mismo.
|
|
|
En línea
|
|
|
|
Manu in Motion
Desconectado
Mensajes: 5
|
Gracias.
En primer lugar, uso Dev-C++, más que por el idioma, que me apaño, porque Code:Blocks siempre me responde a la ejecución del programa con
Process terminated with status 1957557385 (0 minutes, 14 seconds)
o algo parecido y no sé cuál es el problema, mientras que Dev-C++ me ha funcionado bien de momento. Aunque no tengo inconveniente en cambiar si me dais una solución.
He probado a cambiar
setbuf(stdin, NULL);
por
fflush(stdin);
y ha funcionado, pero lo cierto es que es la primera vez. Antes los programas no esperaban al Enter para cerrarse a no ser que pusiera
system("PAUSE");
con lo que me salían dos mensajes de cierre y tenía que pulsar dos veces.
Ya sé que las dos funciones de cout son equivalentes y deberían funcionar. De hecho, al compilar no me dan errores ni Dev-C++ ni Code:Blocks con ninguna de las dos funciones, pero no se ejecutan. De ahí mi duda.
El tema del endl en vez de \n ya lo había mirado, pero, al estar siguiendo las prácticas del libro, quería ser lo más fiel posible. Puedo cambiarlo como una mejora de estilo de todas formas.
Muchas gracias por la respuesta.
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
pues usa QtCreator... no hace falta que uses las librerías de Qt, puedes programar también con la stl si quieres... y desde luego funciona muuuuucho mejor que Devcpp
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Gracias.
En primer lugar, uso Dev-C++, más que por el idioma, que me apaño, porque Code:Blocks siempre me responde a la ejecución del programa con
Process terminated with status 1957557385 (0 minutes, 14 seconds) Esa es una característica de depuración. Esto tiene como finalidad dos cosas: - Evitar que el programa se cierre cuando termine (sin necesidad de poner pausas y esas cosas). - Ver cuanto tiempo le ha llevado a tu programa. Pero esto es exclusivo de Codeblocks, si abres el exe verás que este letrero no aparece. (También se puede desactivar esta depuración en project -> project options -> build targets -> desmarca "pause execution in the end"). PD: ¿Hablas del letrero que te aparece dentro del programa no? He probado a cambiar
setbuf(stdin, NULL);
por
fflush(stdin); fflush(stdin); es todavía peor. Es una aberración al estándar, funciona únicamente en Windows como "caso especial". y ha funcionado, pero lo cierto es que es la primera vez. Antes los programas no esperaban al Enter para cerrarse a no ser que pusiera ¿? A mí me va perfecto esto: #include <iostream> #define PI 3.14 using namespace std; int main (void) { int numero = 10; cout << numero << " es el valor de la variable numero." << '\n'; cout << "La primera letra de KILO es: " << 'K' << '\n'; cout << PI << " es el valor de la constante pi.\n"; cout << "((3+7)*2) = " << ((3+7)*2) << '\n'; cout << "Hola a todos\n"; cout << "\nPulse Intro para finalizar..."; cin.get(); return 0; }
C++ no necesita limpieza de buffer ni esas bobadas que tenía C Ya sé que las dos funciones de cout son equivalentes y deberían funcionar. De hecho, al compilar no me dan errores ni Dev-C++ ni Code:Blocks con ninguna de las dos funciones, pero no se ejecutan. De ahí mi duda. ¿Que quieres decir con que no se ejecutan? El tema del endl en vez de \n ya lo había mirado, pero, al estar siguiendo las prácticas del libro, quería ser lo más fiel posible. Puedo cambiarlo como una mejora de estilo de todas formas. Como veas, ambas cosas hacen lo mismo
|
|
« Última modificación: 1 Julio 2013, 22:36 pm por amchacon »
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
C++ no necesita limpieza de buffer ni esas bobadas que tenía C
Corrección: no está de más, antes de hacer una lectura del buffer de teclado asegurarse de que el usuario no ha escrito nada antes que pueda afectar a la lectura... como todo buffer almacena información y a no ser que la leas o descartes sigue ahí esperándote cual bomba de relojería.
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Corrección: no está de más, antes de hacer una lectura del buffer de teclado asegurarse de que el usuario no ha escrito nada antes que pueda afectar a la lectura... como todo buffer almacena información y a no ser que la leas o descartes sigue ahí esperándote cual bomba de relojería.
Aún así no se podría aplicar en este caso (aquí no ha habido ninguna lectura de teclado).
|
|
|
En línea
|
|
|
|
Manu in Motion
Desconectado
Mensajes: 5
|
Esa es una característica de depuración. Esto tiene como finalidad dos cosas:
- Evitar que el programa se cierre cuando termine (sin necesidad de poner pausas y esas cosas). - Ver cuanto tiempo le ha llevado a tu programa.
Pero esto es exclusivo de Codeblocks, si abres el exe verás que este letrero no aparece.
(También se puede desactivar esta depuración en project -> project options -> build targets -> desmarca "pause execution in the end").
PD: ¿Hablas del letrero que te aparece dentro del programa no?
Hablo del build log. En el letrero que aparece me sale: Process returned 1957557385 (0x74ADF489) execution time : 0.718 s Press any key to continue. ¿Ahí debería salirme el programa y luego eso? Y sino, ¿hay alguna forma de ejecutar el programa y ver el resultado desde dentro del programa? Hablando del Code:Blocks, claro, si decís que el Dev-C++ es tan malo y debería dejarlo. Lo del setbuf y el fflush ya me ha quedado claro. Gracias a los dos. ¿Que quieres decir con que no se ejecutan?
Pues que en el Dev-C++ el programa sólo llega a ejecutarse cuando en la primera línea de código de cout va delante numero. Al ponerlo como debería ser en principio, el programa se compila sin errores, pero no se ejecuta, que es lo que me tiene desconcertado. cout << numero << " es el valor de la variable numero." << '\n';
El problema está en la primera línea de cout. Tendría que poner
cout << "La variable numero almacena: " << numero << '\n';
pero puesto así no funciona.
Gracias por la ayuda.
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Hablo del build log. En el letrero que aparece me sale:
Process returned 1957557385 (0x74ADF489) execution time : 0.718 s Press any key to continue.
¿Ahí debería salirme el programa y luego eso? Y sino, ¿hay alguna forma de ejecutar el programa y ver el resultado desde dentro del programa? Hablando del Code:Blocks, claro, si decís que el Dev-C++ es tan malo y debería dejarlo. Esque hay dos letreros, uno que aparece en el build log y otro que aparece en el mismo programa (si tienes activada la opción que dije). Lo de que muestre valores raros: Codeblocks ejecuta el programa, cuando un programa termina te devuelve un valor. Por conceso se determina que: - Valor 0: Programa finalizado con éxito. - Distinto de 0: Error fatal, el valor es cosa tuya (por ejemplo, podrías poner un 1 si no hay suficiente memoria disponible, un 2 si no se encontró un archivo vital para el programa). El problema esque en los programas de consola, no se controlan los eventos. De modo que cuando tu pulsas el botón X, el programa es forzado a salir y el valor que se devuelve es simplemente "basura". Si en vez de pulsar X sigues el programa hasta el final verás que te devuelve un valor correcto. De todas formas, no tiene mayor importancia y no deberías prestarle ninguna atención. Pues que en el Dev-C++ el programa sólo llega a ejecutarse cuando en la primera línea de código de cout va delante numero. Al ponerlo como debería ser en principio, el programa se compila sin errores, pero no se ejecuta, que es lo que me tiene desconcertado. Ponnos el código entero, ya te hemos dicho que así tal cual te debería ir ambas opciones: cout << numero << " es el valor de la variable numero." << '\n'; cout << "La variable numero almacena: " << numero << '\n';
|
|
|
En línea
|
|
|
|
Manu in Motion
Desconectado
Mensajes: 5
|
Vale, a ver, porque al hablar de Code:Blocks la cosa cambia, porque no veo el programa ejecutarse en ningún lado y no sé si hay fallos o no (al compilar no da ninguno). El código es: #include <iostream> #define PI 3.14 using namespace std;
int main (void) { int numero = 10;
cout << "El valor de la variable numero es: " << numero << '\n'; cout << "La primera letra de KILO es: " << 'K' << '\n'; cout << PI << " es el valor de la constante pi.\n"; cout << "((3+7)*2) = " << ((3+7)*2) << '\n'; cout << "Hola a todos\n";
/* Hacemos una pausa hasta que el usuario pulse Intro */ cout << "\nPulse Intro para finalizar..."; cin.get(); }
Y lo que me sale al ejecutar el programa después de compilarlo es únicamente esto: Tenía entendido que con Code:Blocks, al ejecutar el programa, se abría la ventana de ejecución y no se cerraba como en Dev-C++, por eso empecé con él en un principio, pero al ver que sólo me salía eso, cambié. No sé si es lo normal o no. Siento dar tanto el coñazo.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Envio de los componentes de un listbox a traves de un sockert
Programación Visual Basic
|
W3XT3R
|
2
|
1,520
|
2 Diciembre 2005, 20:43 pm
por {_The_Alwar_}
|
|
|
Alemania suprime el envío de invitaciones no solicitadas a través de Facebook
Noticias
|
wolfbcn
|
0
|
1,744
|
24 Enero 2011, 22:06 pm
por wolfbcn
|
|
|
Eludir la prohibición de envío de ejecutables a través de Facebook
Noticias
|
wolfbcn
|
0
|
1,388
|
31 Octubre 2011, 17:52 pm
por wolfbcn
|
|
|
Duda con cin y cout
Programación C/C++
|
Neptune_one
|
3
|
3,429
|
4 Septiembre 2012, 08:33 am
por Stakewinner00
|
|
|
¿Cómo mejorar el envío de whatsapps a través de un enlace?
Mensajería
|
fcf123
|
0
|
1,602
|
6 Octubre 2018, 11:50 am
por fcf123
|
|