2009-06-26 12 views
10

Estoy intentando construir un archivo .exe para el K & R "Hello, world". El código dado en el libro es:¿Por qué la salida de mi programa parpadea y se cierra en Windows?

#include <stdio.h> 
main() 
{ 
    printf("Hello, world!\n"); 
} 

Cuando construyo & huyendo de Code :: Blocks (en Windows XP), me sale la ventana de símbolo con el mensaje "Hola mundo". Permanece abierto hasta que lo cierre manualmente. Sin embargo, cuando hago doble clic en el archivo .exe, el mensaje simplemente parpadea y desaparece, ¿por qué?

+0

complemento: _asm int 3 – toto

+0

Puede comprobar aquí [Mi respuesta a este problema] [1] http://stackoverflow.com/a/30826808/ 5007758 – Khalif21

Respuesta

19

Nadie está explícitamente que esta diciendo, por lo que será:

Lo que se ve cuando se hace doble clic en el archivo es normales. Lo que hace su IDE (mantener la ventana abierta) es una característica para ayudarlo a depurar la aplicación.

¿Por qué es esto así?

Como está desarrollando una aplicación de consola, tiene que haber una consola para que su aplicación muestre su salida. Si todavía no hay ninguno, se crea una nueva consola (que es la ventana negra).

Si inicia su programa desde el interior de una consola (por ejemplo, desde cmd.exe), simplemente heredará la consola del principal sin crear una nueva [1].

Después de que sale la última aplicación que usa la consola (que, en el primer caso es solo su programa), la consola se cierra. Notará esto todo el tiempo para aplicaciones de consola que imprimen nada más que un texto de ayuda cuando se ejecutan sin parámetros. Si hace doble clic en ellos desde el explorador, una ventana negra con texto parpadeará e inmediatamente se cerrará.

  • A veces, un programa que hace algo y los cierra de inmediato es lo que desea. Por ejemplo, puede llamar a estas aplicaciones desde scripts.

  • Por otro lado, su aplicación podría ser interactiva: esperar la entrada del usuario, hacer algo y solo salir cuando el usuario se lo indique. No es posible crear secuencias de comandos de estas aplicaciones, obviamente, ya que deberá tener un presente humano en el teclado para indicarle a la aplicación qué hacer.

ahora llegamos a la parte IDE: digamos que usted está desarrollando una aplicación de la primera clase, uno que hace algo y luego se cierra inmediatamente. No es muy conveniente que la pantalla parpadee y desaparezca cada vez que la ejecutes, porque ¿cómo puedes saber si el programa funcionó? Asumiendo que puedes decir esto desde la salida que genera.

Por supuesto, puede iniciar una ventana de línea de comandos y ejecutar la aplicación desde allí, pero el programa se ejecutará por separado desde el IDE, y perdería capacidades de depuración en vivo.

Por lo tanto, a los fabricantes de IDE se les ocurrió una función para las aplicaciones de consola: cuando ejecutas la aplicación directamente desde tu IDE, luego, generalmente esperan una pulsación de tecla. Esto le da la oportunidad de inspeccionar la ventana con la salida, para confirmar que la aplicación está funcionando correctamente.


[1] Esoterica: a menos que vaya a través de una aplicación que no hereda la consola. Cualquier aplicación de consola iniciada por esa aplicación no heredará la consola, ya que la aplicación GUI ha roto la herencia. Por ejemplo, start.exe hace esto.Compare:

foo.exe (inherits the console) 
start foo.exe (start.exe is a GUI app, so foo.exe is launched in a new console) 
+0

Gracias por la respuesta muy completa. Seguimiento rápido, suponiendo que mi documento .exe está en algún lugar de mi carpeta "Mis documentos", ¿cómo lo ejecuto desde un comando cmd? Me doy cuenta de que esto es un paso * debajo * básico ... – JDelage

+1

Wow. Respuesta agradable, completa y comprensible. –

+1

Primero tiene que "mover" al mismo directorio que su ejecutable, al igual que lo hace en el explorador. Lo haces con el comando 'cd' para Change Directory. De esta manera: 'cd" C: \ Docu \ user My Do "etc. te ayuda porque autocompleta los nombres de directorio para que no tengas que escribirlos :). – rix0rrr

4

Cuando se ejecutan desde IDE de esta manera, ejecutan el programa y cuando termina de ejecutarse, lo cierran.

Dado que la única función de su programa es imprimir un valor, lo hace y se cierra.

Debería intentar agregar algo que solicite la entrada del usuario al final o compilarlo en .exe y ejecutarse usted mismo desde la línea de comandos.

Como está comenzando, le recomiendo que lo ejecute solo desde la línea de comandos. Eventualmente aprenderá sobre la entrada del usuario y allí puede tener la ventana de línea de comando abierta cuando usa su programa.

1

La solución preferida es ejecutar el ejecutable desde la línea de comandos.

1

Intenta ejecutar tu archivo binario desde la línea de comandos.

1

Esto se debe a que el archivo ejecutable abre su propio cuadro de diálogo. Cuando el ejecutable ha terminado de ejecutarse, apaga el cuadro de diálogo que se abrió para ejecutarse. Sin embargo, cuando USTED es el que abrió el cuadro de diálogo, desaparece cuando USTED lo cierra.

De modo que si abriera un símbolo del sistema y luego ejecutara el ejecutable, el cuadro de diálogo no se cerraría automáticamente.

16

Si no ejecuta un comando de línea ejecutable de una ventana de línea de comando ya abierta, Windows cerrará automáticamente las ventanas después de que el programa haya finalizado. Intente abrir cmd.exe, navegue hasta el directorio de su programa y ejecútelo desde allí, la ventana debe permanecer abierta.

+1

Esta idea es especialmente buena para alguien que trata de superar los ejercicios de K & R. – Dingo

3

Comportamiento normal.

Su programa ejecuta cada acción en el orden de la principal. Entonces imprime, y luego pasa a la siguiente operación, no hay ninguna, por lo que sale. Como la ventana de la consola está vinculada a su .exe, la ventana de comando se cierra con el programa.

Si no desea que su programa salga de inmediato, puede hacerlo dormir o esperar a que el usuario ingrese antes de salir.

3

Al hacer doble clic en un .exe en Windows, está iniciando un nuevo proceso. Windows tiene 2 tipos básicos de procesos: Ventana y Línea de comando. La muestra de hello world que ha escrito es un proceso de línea de comando.

Un proceso de línea de comando lanzará una nueva ventana de comando al inicio. Esta es la ventana que aparece, que es en gran parte un fondo negro con texto blanco. Al finalizar un programa, la ventana se cerrará.

0

sólo tiene que añadir

system("pause"); 

línea antes de vuelta. no es el mejor, sino el método universal.

+0

Nota: el sistema ("pausa") nunca debería aparecer en el código de producción. – Brian

+3

Por favor, no. Claro que hace el trabajo en Windows, pero no funcionaría en otro sistema operativo. Es mejor aprender cómo esperar la entrada de un carácter usando la biblioteca C. – Ksempac

+5

No creo que "Hello, World" esté destinado a la producción. Tal vez yo estoy equivocado. Después de todo, un sonido de pedo está ganando mucho dinero en el iPhone. – xcramps

1

Esto se debe a que desde el ejecutable, se ejecuta el código en una nueva ventana y luego se completa el proceso, no tiene motivo para permanecer abierto, se ha completado lo que se quería hacer. Hay un par de cosas que puedes hacer. Puede ejecutarlo desde la línea de comando cmd.exe, o incluso podría colocar algo al final de su código que escuche una pulsación de tecla, y una vez que se detecta el trazo de tecla, permita que el programa salga.

2

Agregue getch(); antes de la llave de cierre. Esto solicitará una entrada después de que se imprima la salida. Una vez que ingrese un carácter, la ventana se cerrará. Esto debería solucionar tu problema.

0

Aquí está mi opinión sobre esto:

// Hello sweetie (Spoilers) 
#include <iostream> 
using namespace std; 

int main() 
{ 
// Print the text to screen 
    cout << "************************************"; 
    cout << "\n"; 
    cout << "Hello World!"; 
    cout << "\n"; 
    cout << "You may close me by pressing Enter"; 
    cout << "\n"; 
    cout << "************************************"; 
    cout << "\n"; 
    cout << "\n"; 

/* 
This will prompt for an input after the output is printed. 
Once you hit the Enter key the window will close. 
*/ 
    if (cin.get() == '\n') 
    return 0; 
} 
Cuestiones relacionadas