| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > вопрос о контроле границ |
| Автор: 555shiro 17.5.2010, 16:35 | ||
| Доброе время суток! у меня такой вопрос,почему данная программа резко закрыается,ведь компилятор должен вывести символ "у" и "r" ? помогите с разрешением? заранее благодарю!
|
| Автор: toxx 17.5.2010, 16:45 |
| http://codepad.org/nqoycy5t так он и выводит, то что нужно =) |
| Автор: kemiisto 17.5.2010, 16:50 | ||
Как вариант - использовать (всегда) std::endl для... to flush the output buffer, короче. Что-то не могу по-русски сформулировать...
|
| Автор: djamshud 17.5.2010, 16:53 |
| Или сделать fflush(stdout). |
| Автор: kemiisto 17.5.2010, 16:57 |
Хм... Что-то я не прочитал внимательно. Пробовать всё равно не буду. Ибо от богомерзкой смеси С и С++ тошнит. |
| Автор: toxx 17.5.2010, 16:59 | ||
а я попробовал и работает! |
| Автор: kemiisto 17.5.2010, 17:05 | ||
|
| Автор: toxx 17.5.2010, 17:12 |
| kemiisto а я исправил эти ошибки...интересно какой компилятор еще сумел пропустить их и "программа резко закрыается" |
| Автор: djamshud 17.5.2010, 17:14 | ||
kemiisto,
|
| Автор: kemiisto 17.5.2010, 17:47 | ||
| djamshud, да я, как бы, в курсе. В этом треде не меня нужно учить программировать. И да, getch(); лучше заменит на std::cin.get(); Добавлено @ 17:54
C минимальными правками. |
| Автор: toxx 17.5.2010, 18:24 | ||
Мало ли, вдруг не знаете |
| Автор: kemiisto 17.5.2010, 18:54 | ||
Ссылку в студию. Кто там и чего не рекомендует. Оверхед? В галимой учебной поделке на 20 строк? Не нужный? Тут очень даже нужный. |
| Автор: GoldFinch 17.5.2010, 20:17 |
| kemiisto, вы писали "использовать (всегда)" а не для этой "учебной поделке на 20 строк". endl следует использовать только если надо явно указать что кроме завершения строки, надо еще и сбросить буферы. >Кто там и чего не рекомендует Герб Саттер "Новые сложные задачи на С++", задача 1, замечание 5. |
| Автор: 555shiro 17.5.2010, 20:28 |
| возможно я неправильно выразился,так как начинающий только,я хотел сказать что на экране что то выходит,но затем он резко исчезает...а хотелось бы чтобы он задержался,чтобы можно было увидеть что там написано...для этого я использовал getch()...но почему то все равно экран не задерживается....... |
| Автор: kemiisto 17.5.2010, 20:53 | ||||||||||||
GoldFinch, ты - тролль.
Я это где писал? В книжке по С++ за моим авторством? В заметке в блоге под названием "100 правил программирования на С++"? Нет. Я это писал в этой конкретной теме. Про эту конкретную учебную поделку. Я не случайно поставил скобки. Что это значит? Я вижу, что автор - новичёк и даю самый простой и топорный совет, полезный на начальных этапах обучения. Лучше пускай всегда сбрасывает буфер и получает вывод в консоль в тот момент, когда этого ожидает. Позже, когда "повзрослеет, сам разберётся, где сбрасывать буфер, а где нет. Вырывать из контекста нельзя. Пример из Саттера
Замечание 5.
В том примере - очевидно, что предпочтительнее '\n' в цикле и endl после выхода из цикла. Массивчик не большой. Разницы в появлении его элементов в выводе не будет. У нас совершенно иная ситуация - вывод в нескольких методах. Если не сбросить буфер в одном методе, который выполнится, а затем прога рухнет, то в консоли ничего не появится и можно сделать неправильные выводы о местоположение критического бага. Так что не фига тут троллить. И заметь, ты подставляешь Саттера, выдирая его слова из контекста. Он поясняет, что имел ввиду. Приводит пример. Фактически, цитировать нужно не
а то, что написано дальше:
Если, лучше... Чуствуешь разницу? Сначала декламируется правило для быдла, потом поясняется, для тех у кого есть мозг. Многие книги по С++ написано в таком стиле. Вырывать из контекста нельзя. |
| Автор: GoldFinch 17.5.2010, 21:24 | ||||
У меня уже аллергия на обвинения в троллинге. Особенно когда их используют как аргумент в споре.
Всегда использовать endl по причине того что "прога рухнет, а в консоли ничего не появится" - это серьезная пессимизация, это не решение проблемы с падением проги. ЭТО ПЛОХОЙ СОВЕТ. От такого совета софт не станет правильнее и надежнее, он будет только более некачественным. У endl есть конкретное назначение - его следует использовать только если есть необходимость вызвать flush, а постоянно дергать flush - это тормоза. Падения проги должны обрабатываться нормальными способами. Конкретно в этом случае - убивать прогу exit'ом нельзя вообще. Даже если сделать cout << endl - это поможет тольк cout, а если где-то есть еще вывод например в файл, то для этого файла никто не сделает flush, если есть еще какие-то объекты, их никто удалит. Надо бросать исключение. Возможно его кто-то поймает и обработает. Если никто не обработает -то по крайней мере будут вызваны деструкторы объектов (не всех), в том числе будет вызван деструктор cout. Добавлено через 5 минут и 22 секунды
У меня создалось впечатление что вы провели аналогию между ТСом и любыми новичками и быдлом. Это нарушает правила форума и не нравится мне лично. Исправьте свой пост. |
| Автор: kemiisto 17.5.2010, 21:40 | ||||
Это был не аргумент. Ага. Давай, расскажи ТС'у про исключения. А я послушаю.
У меня создалось впечатление, что ты видишь некую потенциальную причинно-следственную связь между твоими впеяатлениями и моими действиями. Это обманчивое впечатление. К тому же, аналогии там никакой не было. Новичкам - топорные решения, быдлу - лозунги, остальным - по вкусу. |
| Автор: GoldFinch 17.5.2010, 22:09 | ||||||
Все просто: вместо
надо писать
программа так же закроется, но при этом будут произведены все завершающие действия. |
| Автор: ИванМ 17.5.2010, 22:42 |
| 555shiro, как я понимаю, прога вырубается после a.put(6)='!';, т.к. происходит выход за границы массива. getch() надо ставить перед этой строчкой, а не после нее. |
| Автор: kemiisto 17.5.2010, 23:16 |
| ИванМ, я, конечно, дико извиняюсь. Но, много_матов, неужели непонятно, что я потратил своё время на форматирование и причёсывание кода не просто так. Ещё немного и ТС, возможно, САМ нашёл бы ошибку. И тут... |