Duda con el envío encadenado a través de cout en C++

Iniciado por Manu in Motion, 1 Julio 2013, 19:11 PM

0 Miembros y 1 Visitante están viendo este tema.

Manu in Motion

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.

amchacon

Lo primero es recomendarte que no uses DevCpp:
http://foro.elhacker.net/programacion_cc/iquestpor_que_no_deberias_usar_el_devcpp-t385150.0.html

Lo segundo:

Código (cpp) [Seleccionar]
setbuf(stdin, NULL);

Esto no es necesario.

Lo tercero esque:

Código (cpp) [Seleccionar]
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:

Código (cpp) [Seleccionar]
cout << "La variable numero almacena: " << numero << endl;

Aunque el efecto es el mismo.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Manu in Motion

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.

eferion

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

amchacon

#4
Cita de: Mackeli en  1 Julio 2013, 20:28 PM
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?

Cita de: Mackeli en  1 Julio 2013, 20:28 PMHe 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".

Cita de: Mackeli en  1 Julio 2013, 20:28 PMy 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:

Código (cpp) [Seleccionar]
#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

Cita de: Mackeli en  1 Julio 2013, 20:28 PMYa 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?

Cita de: Mackeli en  1 Julio 2013, 20:28 PMEl 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  ;)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

eferion

Cita de: amchacon en  1 Julio 2013, 22:31 PMC++ 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.

amchacon

Cita de: eferion en  1 Julio 2013, 23:59 PM
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).
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Manu in Motion



Cita de: amchacon en  1 Julio 2013, 22:31 PM
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.

Cita de: amchacon en  1 Julio 2013, 22:31 PM
¿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.

Cita de: Mackeli en  1 Julio 2013, 19:11 PM
    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.

amchacon

Cita de: Mackeli en  2 Julio 2013, 00:57 AMHablo 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.

Cita de: Mackeli en  2 Julio 2013, 00:57 AMPues 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:

Código (cpp) [Seleccionar]
cout << numero << " es el valor de la variable numero." << '\n';
cout << "La variable numero almacena: " << numero << '\n';
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Manu in Motion

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.