- 1
- 2
- 3
char line[10];
cout<<"Press any key to exit"<<endl;
cin.getline(line,9);
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+151
char line[10];
cout<<"Press any key to exit"<<endl;
cin.getline(line,9);
Очередной перл из решений кандидатских задач.
Видимо в военное время количество символов, генерируемых одной клавишей, может достигать 9. :)
Потому что getline читает не 1-н символ, а их последовательность. вроде тут всё корректно.
`basic_istream<>::getline` завершает ввод при выполнении одного из трех условий:
1) возникло условие "конец файла" (в потоке выставляется `eofbit`)
2) прочитан символ окончания ввода (в данном случае - '\n'),
3) прочитано n-1 символов (в потоке выставляется `failbit`)
В том, что данный код - говнокод сомневаться, разумеется, не приходится. Возможно "аффтар" понимал, что пользователь будет недоуменно нажимать, скажем, пробел и, чтобы пользователь не мучался до второго пришествия, ограничил длину ввода 8 символами. Т.е. если пользователь не догадался сразу нажать именно на Enter, то его мучения с разнообразными any key закончатся после 8-ми нажатий.
Тем не менее умиляет использования размера 9. Если уж буфер выбран размера 10, то именно 10 надо было и передавать в `getline` (`sizeof line` например). Хотя, конечно, бессмысленно рассуждать о размере тогда, когда сам подход крив донельзя.
В Викицитатнике есть цитата: http://ru.wikiquote.org/wiki/Лец
Но нет ссылки на произведение.
http://tinyurl.com/35o4uwc
Однако, из русского раздела Википедии статья о нём удалена.
Нет, видимо все-таки в курсе.
1) тут мимо кассы, ибо ввод идет с клавиатуры.
2) Именно этот вариант тут дает то, что задумывалось - завершение программы.
3) Это все замечательно, только этого не произойдет пока не встретиться \n или конец файла. Так что практической пользы от этого уточнения в данном случае - 0.
>Возможно "аффтар" понимал, что пользователь будет недоуменно нажимать, скажем, пробел и, чтобы пользователь не мучался до второго пришествия, ограничил длину ввода 8 символами. Т.е. если пользователь не догадался сразу нажать именно на Enter, то его мучения с разнообразными any key закончатся после 8-ми нажатий.
Юзер может хоть до посинения жать пробел. Ничего не будет, пока он не нажмет Enter.
--
спец предложение от "logitech"
http://www.getdigital.de/images/actionshots/t4/AnyKey_Morse.JPG
А на русский почему-то перевели только на ЕС-1840.
Кстати лучшая рассовая немецкая клава у меня:
http://www.daskeyboard.com/model-s-ultimate/
А в современных мамах иногда уже даже i8042-то нет... И даже его эмуляция в USB стала необязательной
кстати, их даже вроде бы сейчас по лицензии кто-то делает
"Unicomp has had difficulty making them profitable because they rarely break" (педивикия)
спасибо за наводку.
Вопрос немного не в тему, а на клавиши Вы что-то наклеили или так оставили?:)
конечно, так оставил) довольно редко промахиваюсь)
а как она стучит....
http://www.gamedev.ru/files/images/dsc00002.jpg
а то у всех секретарш и прочих чайников кроме вопроса "А где Any Key?" появились бы вопросы типа "А где Esc?", "А где Home?", "А где Insert?", "А где Caps Lock?"...
кроме того, перевод был бы ужасным, как обычно.
Ведь у них «Entfernen» и «Annulaire» соответственно.
В военное время могут трястись руки и получаться дребезг.
На клавиатуру может упасть бездыханное тело (или еще-не-бездыханное тело будет нажимать кнопки головой).
А размер буфера отражает серьезность намерений — человек действительно хочет нажать кнопку:)
Или где-то не работает?
Или может это не обязательно stdin? Вот только когда общение идёт с пользователем, KeyPressed должно хватить
я сказал:
> кроссплатформенной
а школьным курсом Turbo Pascal 7.0 ты блеснул,
передаст неочищенный буфер клавиатуры родителю. Самый смак будет, если глупый юзер вместо any key жмакнул ↵, а родитель - NC или любая другая оболочка, которая по ↵ запускает прогу еще раз :-D
Модуль Crt — УГ редкостное. KeyPressed не реагирует на F11, F12 и ещё на кучу символов, а ReadKey для некоторых клавишей нужно вызывать два раза. Проще написать свои функции, чем подстраиваться под Crt. Не потому ли у него куча альтернатив?
Я делал так:
Естественно, для виндовой версии этот код придётся переписывать.
ну да, как и документации
http://www.freepascal.org/docs-html/rtl/crt/readkey.html
Было бы хуже если бы этого не было написано.
>Я делал так
Вроде freepascal обсуждаем, а не то как кто-то когда то делал под TP
я залез в Джордейна, а у него прямо эта техника и описана
насчет ReadKey и расширенных клавиш у меня к Crt нареканий нет (если вернула #0 - изволь прочитать скан-код), а вот, помнится там был замечательный busy-loop для того, чтобы высчитать, сколько итераций можно сделать между прерываниями времени суток (калибровка для Delay) результат хранился в слове и на быстрых процах линковка с Crt автоматически означала падение с divide by zero. Вот это да, сильно. И оф. патча не было. К счастью, сырцы RTL прилагались.
К чему это? речь шла про кроссплатформеность
> divide by zero
это по-моему error 200, или 220 уже не помню.
Но вроде была небольшая программка, patchpas.com по-моему, она могла пропатчить уже готовый exe, на тот случай, если исходников нет..
>в мире freepascal такая хрень часто встречается, потому что процедура ждать строки из stdin - стандартная, а ждать любой кнопки - кроссплатформенной функции нет
Так что, есть?
Видимо, здесь обсуждают решение для DOS/Realmode
> вроде была небольшая программка, patchpas.com по-моему,
> она могла пропатчить уже готовый exe
Даа, линковать кривую RTL и потом патчить исполняемый модуль - это годное, системное решение
Лично мне попалась не такая уж небольшая и вдобавок потребовала DOS4GW
Кстати, из описания бага следует, что патч RTL увеличивает размер кода, и утилита для пост-обработки бинарей должна быть либо очень умной, либо должна изговнякать код от которого зависит Delay
на какие платформы Crt.KeyPressed, Crt.ReadKey не портировали предлагаю найти самостоятельно, ОК? (без подвоха, такие есть)
>Даа, линковать кривую RTL и потом патчить исполняемый модуль - это годное, системное решение
"А ещё тролопотамусы прикидываются кактусами, отвечая на высказывания выкидывая из них значимые части, например:"
>>она могла пропатчить уже готовый exe, на тот случай, если исходников нет
>не портировали предлагаю найти самостоятельно, ОК?
Мне это не надо.
>а ждать любой кнопки - кроссплатформенной функции нет
Я показал, что всё таки есть, если хочешь оспорить и показать что на некоторых платформах не реализовано - ищи сам.
> > а ждать любой кнопки - кроссплатформенной функции нет
> Я показал, что всё таки есть
Ну-ка, ну-ка, посмотрим
ищи слово caveats и читай вокруг
это был совет
>Если уж настолько важен бинарь от проебанных исходников, есть решения по-приличнее.
Ну да, ты наверное относишься к клану программистов, которые никогда не используют чужие программы - ездят исключительно на своих велосипедах.
* собрал седьмым турбопаскалем под DOS
* за 15 лет вообще свое творение не трогал
* не отдал сырцы при этом
Я тя научу, что делать. В третий день новой луны, семижды перекрестясь, подходишь к ларьку, берешь два пива и тюбик кольдкрема. Потом идешь к автору и обратив ягодицы к востоку и произносишь след. заговор: «чуваак! твоя тулза на моем проце падает! пересобери её virtual pascal`ем!»
>>она могла пропатчить
>* за 15 лет вообще свое творение не трогал
я не говорил того, что пользуюсь ей по сей день
-"Мы продолжаем наш цикл передач про тролопотамусов. Тролопотамусы, в силу своих пристрастий любят затягивать дискуссии, коверкая высказывания участников дискуссии. Но тем не менее, если дискуссия складывается не в их пользу, выставляя их дураками, их ограниченные умственные способности не дают им осознать того, что они виновники, как они это называют "сантабарбары" "
Как, как Вы меня назвали?
P.S. А что с Царём?
https://gist.github.com/superhackkiller1997
Дальше... Пока не вижу... Ждите...
http://ololo.fm/search/Emanuel+Hovaghimian/Spring+(Palabras)
Прежде чем написать, я посмотрел сюда http://www.freepascal.org/docs-html/rtl/crt/keypressed.html
И если ты не заметил, я спросил явно
>Или где-то не работает?
А кто сказал что после
repeat until KeyPressed;
не надо очищать буфер? Если ты так говнокодишь, после школьного курса TP 7.0, то давай ещё говнокоды студию
Поздно, мистер Баттхёрт!
во, раскопал, хотя пованивает, ибо INT 09 может всё испортить
Это из разряда в рот мне ноги хвост!
или так:
Но, как я уже писал, стандартная KeyPressed ущербна, поэтому её надо переписывать.
ы?
Кто такие ScanCode и @@1? Кусок из Турбовижен?
Кстати, чтобы реагировать на Ф11, Ф12 и всякие суперпуперклавиши современных клавиатур, нужно заменить 1 на 11h.
Моя мысль о том, что не стали переделывать на INT 16 AH=10h,11h именно потому что расширенные клавиши не генерируют символов
Те кто программировал на TP, это и так знают. Другим же это нах не надо.
> Но, как я уже писал, стандартная KeyPressed ущербна, поэтому её надо переписывать.
Для кого? Зачем?
Когда у троллопотамусов заканчиваются аргументы, у них начинается словесный понос"
Шикарно. А ReadKey; Не подойдет?
Или раз уж раздел по C++
getch();
Геч, бля...
repeat until KeyPressed;
что
ReadKey;
результат один. Только ReadKey; извлечет символ из буфера ввода.
А чем тебе неканонический режим не нравится? Просто интересно.