elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con el envío encadenado a través de cout en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Duda con el envío encadenado a través de cout en C++  (Leído 5,658 veces)
Manu in Motion

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Duda con el envío encadenado a través de cout en C++
« en: 1 Julio 2013, 19:11 pm »

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 Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda con el envío encadenado a través de cout en C++
« Respuesta #1 en: 1 Julio 2013, 19:34 pm »

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
  1. setbuf(stdin, NULL);

Esto no es necesario.

Lo tercero esque:

Código
  1. cout << numero << " es el valor de la variable numero." << '\n';
  2. 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
  1. cout << "La variable numero almacena: " << numero << endl;

Aunque el efecto es el mismo.


En línea

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

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Duda con el envío encadenado a través de cout en C++
« Respuesta #2 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)

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 Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda con el envío encadenado a través de cout en C++
« Respuesta #3 en: 1 Julio 2013, 20:48 pm »

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 Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda con el envío encadenado a través de cout en C++
« Respuesta #4 en: 1 Julio 2013, 22:31 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?

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:

Código
  1. #include <iostream>
  2. #define PI 3.14
  3. using namespace std;
  4.  
  5. int main (void)
  6. {
  7.    int numero = 10;
  8.  
  9.    cout << numero << " es el valor de la variable numero." << '\n';
  10.    cout << "La primera letra de KILO es: " << 'K' << '\n';
  11.    cout << PI << " es el valor de la constante pi.\n";
  12.    cout << "((3+7)*2) = " << ((3+7)*2) << '\n';
  13.    cout << "Hola a todos\n";
  14.  
  15.    cout << "\nPulse Intro para finalizar...";
  16.    cin.get();
  17.  
  18.    return 0;
  19. }

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

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


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda con el envío encadenado a través de cout en C++
« Respuesta #5 en: 1 Julio 2013, 23:59 pm »

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 Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda con el envío encadenado a través de cout en C++
« Respuesta #6 en: 2 Julio 2013, 00:31 am »

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

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

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Duda con el envío encadenado a través de cout en C++
« Respuesta #7 en: 2 Julio 2013, 00:57 am »



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 Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda con el envío encadenado a través de cout en C++
« Respuesta #8 en: 2 Julio 2013, 01:18 am »

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:

Código
  1. cout << numero << " es el valor de la variable numero." << '\n';
  2. cout << "La variable numero almacena: " << numero << '\n';
En línea

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

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Duda con el envío encadenado a través de cout en C++
« Respuesta #9 en: 2 Julio 2013, 18:28 pm »

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:

Código:
#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

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines