Почему выходные данные моей программы мигают и закрываются в Windows? - PullRequest
10 голосов
/ 26 июня 2009

Я пытаюсь создать файл .exe для K & R "Hello, world". Код, указанный в книге:

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

Когда я собираю и запускаю из Code :: Blocks (под Windows XP), я получаю окно с сообщением «hello world». Он остается открытым, пока я не закрою его вручную. Однако, когда я дважды щелкаю по файлу .exe, приглашение просто мигает и исчезает, почему это так?

Ответы [ 12 ]

20 голосов
/ 26 июня 2009

Никто явно не говорит вам об этом, поэтому я буду:

Когда вы дважды щелкаете файл, вы видите normal . То, что делает ваша IDE (с открытым окном), это функция , помогающая отлаживать приложение.

Почему это так?

Поскольку вы разрабатываете консольное приложение , для вашего приложения должна быть консоль для отображения его вывода. Если его еще нет, создается новая консоль (черное окно).

Если вы запустите свою программу из консоли (скажем, из cmd.exe), она просто унаследует консоль родительского элемента без создания новой [1].

После выхода из последнего приложения, использующего консоль (которая в первом случае является только вашей программой), консоль закрывается. Вы будете постоянно замечать это для консольных приложений, которые при запуске без параметров выводят только текст справки. Если дважды щелкнуть их в проводнике, будет мигать черное окно с текстом, а затем немедленно закрыть.

  • Иногда, программа, которая что-то делает, и они немедленно закрываются, это то, что вы хотите. Например, вы можете вызывать эти приложения из скриптов.

  • С другой стороны, ваше приложение может быть интерактивным: ожидание пользовательского ввода, выполнение какой-либо операции и выход только тогда, когда пользователь сообщает об этом. Очевидно, что вы не можете создавать сценарии для этих приложений, так как вам нужно, чтобы на клавиатуре присутствовал человек, чтобы сообщить приложению, что делать.

Теперь перейдем к части IDE: допустим, вы разрабатываете приложение первого типа, которое что-то делает, а затем сразу закрывает. Не очень удобно заставлять экран мигать и исчезать при каждом его запуске, потому что как вы можете определить, работает ли программа? Предполагая, что вы можете сказать это по выводу, который он генерирует.

Конечно, вы можете запустить окно командной строки и запустить приложение оттуда, но программа будет выполняться отдельно от IDE, и вы потеряете возможности оперативной отладки.

Итак, разработчики IDE придумали функцию для консольных приложений: когда вы запускаете приложение непосредственно из IDE, они впоследствии, как правило, ожидают нажатия клавиш. Это дает вам возможность проверить окно с выводом, чтобы убедиться, что приложение работает правильно.


[1] Esoterica: если вы не просматриваете приложение, которое не наследует консоль. Любое консольное приложение, запущенное этим приложением, не будет наследовать консоль, поскольку наследование было нарушено приложением с графическим интерфейсом. Например, start.exe делает это. Для сравнения:

foo.exe (inherits the console)
start foo.exe (start.exe is a GUI app, so foo.exe is launched in a new console)
17 голосов
/ 26 июня 2009

Если вы не запускаете exe командной строки из уже открытого окна командной строки, Windows автоматически закроет окна после завершения программы. Попробуйте открыть cmd.exe, перейти в каталог вашей программы и запустить его оттуда, окно должно остаться открытым.

4 голосов
/ 26 июня 2009

При запуске из IDE, подобной этой, они запускают программу, а когда она завершается, закрывают ее.

Поскольку единственной функцией вашей программы является вывод значения, она делает это и закрывается.

Вы должны попытаться добавить что-то, что запрашивает пользовательский ввод в конце, или скомпилировать его в .exe и запустить себя из командной строки.

Поскольку вы начинаете, я бы порекомендовал просто запустить его из командной строки самостоятельно. В конце концов вы узнаете о вводе пользователем, и там вы можете открыть окно командной строки при использовании вашей программы.

3 голосов
/ 26 июня 2009

При двойном щелчке по .exe в Windows вы запускаете новый процесс. Windows имеет 2 основных типа процессов: окно и командная строка. Пример Hello World, который вы написали, представляет собой процесс командной строки.

Процесс командной строки запустит новое командное окно при запуске. Это всплывающее окно, которое представляет собой черный фон с белым текстом. По завершении программы окно закроется.

3 голосов
/ 26 июня 2009

Нормальное поведение.

Ваша программа выполняет каждое действие в порядке основного. Таким образом, он печатает, а затем переходит к следующей операции, там нет, поэтому он выходит. Поскольку окно консоли связано с вашим .exe, окно команд закрывается программой.

Если вы не хотите, чтобы ваша программа выходила сразу, вы можете перевести ее в спящий режим или дождаться ввода пользователя перед выходом.

2 голосов
/ 30 июля 2009

Добавьте getch(); перед закрывающей скобкой. Это запросит ввод после того, как вывод напечатан. Как только вы введете символ, окно закроется. Это должно решить вашу проблему.

1 голос
/ 26 июня 2009

Это потому, что из исполняемого файла он выполняет ваш код в новом окне, а затем процесс завершается, у него нет причин оставаться открытым, то, что вы хотели сделать, завершено. Есть пара вещей, которые вы можете сделать. Вы можете выполнить его из командной строки cmd.exe или даже поместить что-то в конец кода, который прослушивает нажатие клавиши, и после обнаружения нажатия клавиши разрешите программе выйти.

1 голос
/ 26 июня 2009

Это потому, что исполняемый файл открывает свое собственное диалоговое окно. Когда исполняемый файл завершает работу, он закрывает диалоговое окно, которое он открыл для запуска. Однако когда вы открыли диалоговое окно, оно исчезнет, ​​когда вы закроете его.

Таким образом, если вы откроете командную строку и затем запустите исполняемый файл, диалоговое окно не закроется автоматически.

1 голос
/ 26 июня 2009

Попробуйте запустить бинарный файл из командной строки.

1 голос
/ 26 июня 2009

Предпочтительным решением является запуск исполняемого файла из командной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...