Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

exit(0)

70K
02 июля 2011 года
yarikdudar
5 / / 19.06.2011
Ребята вот код программы :
Код:
#include <locale.h>
#include <iostream>
#include <process.h>
using namespace std;
int main ()
{   setlocale(LC_CTYPE,"Russian");



unsigned long i,j;
cout << "Введите число " ;
cin  >> i;
for (j=2; j<=i/2; j++)

    if (i%j == 0)
{
    cout << "Введенное число " << i << " не простое" << endl;
    exit(0);
   
}
    cout << "Введенное число " << i << " простое" << endl;

cin.get();
cin.get();
return 0;
}


Когда ввожу простое число поток cout работает и я могу прочитать сообщение которое в него передалось, но вот при вводе не простого числа программа завершается , а я ведь хочу получить еще сообщение о том что оно не простое почему так происходит?
416
02 июля 2011 года
MaitreDesir
380 / / 02.01.2008
Ну так ты же сам команду Exit(0) ставишь - принудительное завершение. Попробуй этот кусок так написать:
 
Код:
cout << "Введенное число " << i << " не простое" << endl;
        cin.get();
        cin.get();
        return 0;
70K
02 июля 2011 года
yarikdudar
5 / / 19.06.2011
MaitreDesir просто в книжке приводится такой пример , и при работе программы там выводится два потока понимаете вот в чем дело, тоесть при вводе простого числа выводится, и при вводе не простого почему?
416
02 июля 2011 года
MaitreDesir
380 / / 02.01.2008
Книжка знать кривая. Читай от это: http://www.cplusplus.com/reference/clibrary/cstdlib/exit/.
Цитата:
Terminate calling process
Terminates the process normally, performing the regular cleanup for terminating processes.


Exit немедленно завершает процесс, больше никакие комманды выполняться не будут (что бы ты не написал). В принципе, увидеть результат работы можно, если запускать прогу из консоли. Попробуй запустить cmd, с помощью cd перейти в каталог с твоей программой и запустить её - увидишь, что число не простое.
А вообще, по хорошему, надо бы сделать так:

Код:
#include <iostream>
#include <process.h>
using namespace std;
int main ()
{   setlocale(LC_CTYPE,"Russian");



unsigned long i,j;

bool f=true;

cout << "Введите число " ;
cin  >> i;
for (j=2; j<=i/2; j++)
{
           f = f && (i%j == 0)
    if !f
              break;
}
cout << "Введенное число " << i ;
if f
    cout " простое" << endl;
else
    cout " не простое" << endl;

cin.get();
cin.get();
return 0;
}

Так будет грамотней, но только я наверное наврал с синтаксисом - дельфист я, не помню как там чо в сях. Но идея думаю понятна, разберешся.
240
02 июля 2011 года
aks
2.5K / / 14.07.2006
Как сказал MaitreDesir, exit действительно немедленно завершает процесс. При этом ни какие ресурсы корректно не освобождаются если они заняты. А cout буферизует вывод. Естественно при немедленом завершении процесса он не успевает скинуть буфер, поэтому ты и не видишь текст. Замени exit(n) на return n в твоем примере и/или сделай flush.
И запомни - никогда, кроме совсем крайних случаев (если они случаться ты узнаешь, а пока никогда), не используй функцию exit для выхода из программы. Это очень криво и не правильно. Даже уже в такой маленькой программе ты напоролся на ошибку из-за этого. В большой программе последствия могут быть намного хуже.
416
02 июля 2011 года
MaitreDesir
380 / / 02.01.2008
Цитата: aks
При этом ни какие ресурсы корректно не освобождаются если они заняты. А cout буферизует вывод. Естественно при немедленом завершении процесса он не успевает скинуть буфер, поэтому ты и не видишь текст.



O_o.
Я может быть не знаю, aks, поясни плиз..

Цитата:
performing the regular cleanup for terminating processes.


"выполнялняет стандартную очистку при завершения процесса".
У себя щас потестил - вывелось... Объясни плиз, почему может не вывести, если теоретически он должен кидать все буферы?

Но насчет использования Exit согласен, индусизм.. Потому и предложил другой вариант

240
02 июля 2011 года
aks
2.5K / / 14.07.2006
Э, насколько я помню - он как раз не гарантировано сбрасывает буфер. Особено если обработчики exit не корректно завершились. Хотя конечно могу ошибаться - надо почитать документацию. В любом случае использовать exit просто для выхода - очень плохо. Ибо помимо stdio может быть еще куча ресурсов которые автоматически не освобождаюся. Да и вобще прерывать нормальный процесс завершения программы - некорректно. За исключением некоторых случаев. Допустим, когда форк сделали в начале, и старый процесс совсем не нужен - нужно полностью его выгрузить немедлено.
240
02 июля 2011 года
aks
2.5K / / 14.07.2006
Кстати вспомнил забавный случай с exit.
Делали одну десктопную софтинку лет 6 назад. И для декодирования видеокадров приходящих из сети юзали какую то довольно известную для тех нужд на то время открытую библиотеку (сейчас название не скажу за давностью). И вот софтинка иногда внезапно, никого не предупредив закрывалась. Тоесть пользователь работает, там из сети данные получает, какие то параметры не сохранил и тут бац - окно исчезает без предупреждения и все.
После нудного дебага (надож еще момент было поймать когда она выходит) нашли - в этой либе просто вымораживающий код. Не знаю то ли это от какого то старого дебага разработчиков осталось то ли просто кто то с будуна говнокод написал - но для либы такое не простительно. В некоторых случаях, довольно редких, если кадр был сформирован особым, по мнению либы не правильным образом, она не возвращала никакую ошибку с описанием, а просто делала exit. Вот так никого не предупредив. :facepalm:
350
17 июля 2011 года
cheburator
589 / / 01.06.2006
Скорее всего, все очень просто: запускай свою кривопрогу в cmd (в командном процессоре). А то окно закрывается, не дожидаясь нажатия каких-нибудь клавиш, что вполне понятно, т. к. в программе и не заложено ожидать
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог