1. C++ / Говнокод #11361

    +15

    1. 1
    system("PAUSE")

    Красивое, оптимальное, и самое главное, кроссплатформенное решение для ожидания нажатия клавиши.
    http://habrahabr.ru/post/147104/

    Предупреждая вопрос "где здесь с++", отвечу - автор считал, что он пишет на с++, и даже использовал пару конструкций оттуда - перегрузку функций и new/delete.

    Запостил: bormand, 05 Июля 2012

    Комментарии (50) RSS

    • И где здесь C++?

      не удержался
      Ответить
    • getchar
      Ответить
      • Но он же не выводит надпись "Нажмите любую клавишу..."
        Ответить
        • system("pause>nul");
          Ответить
        • Нажмите любую клавишу для продолжения, или другую клавишу для отмены...
          Ответить
          • Ошибка: клавиатура не найдена. Нажмите любую клавишу...
            Ответить
            • произошла непредвиденная ошибка.
              да. нет. отменить.
              Ответить
            • > Ошибка: клавиатура не найдена. Нажмите любую клавишу...
              Несколько раз сталкивался кстати с такой ерундой, только не любую, а F1 обычно.

              http://www.korova.ru/humor/pics/0000/nokey.gif
              Ответить
              • Bios нужно было просто верно настраивать, чтобы отсутствие клавы игнорил. Меня устроит и виртуальная клавиатура от сенсорного экрана или мыши.
                Ответить
                • > Bios нужно было просто верно настраивать
                  Да настраивается то это легко (stop on - all but keyboard). Но пока гром не грянет - мужик не перекрестится...
                  Ответить
                • Не очень хороший совет. Была ситуация, когда при выходе из спящего режима винда ХР из-за отошедших контактов мыши и клавиатуры (кто-то дернул кабеля) не подхватила ни то, ни другое, даже с последующими втыканиями-вытыканиями. Итог - вышедшая из спящего режима (с кучей программ за кадром) винда, висящая на окошке авторизации. Ни зайти, ни отправить обратно в спящий режим. Reset...
                  Ответить
            • >Ошибка: клавиатура не найдена. Нажмите любую клавишу...
              Нажать клавишу мыши или reset достаточно?
              Ответить
    • system("paws");
      system("claws");
      Ответить
    • Боян, кстати:
      http://govnokod.ru/10760
      http://govnokod.ru/9651
      http://govnokod.ru/912
      Ответить
      • Мда, автор кода не одинок...
        Ответить
      • И кстати, баян баяном, но в тех тредах обсуждались иные аспекты говнокодов, и не затронут собственно system("PAUSE").
        Ответить
    • >>Кроссплатформенное решение
      Под линуксом и вендой работает.

      В другом дело:

      $ man 3 system

      DESCRIPTION
      system() executes a command specified in command by calling /bin/sh -c command,
      and returns after the
      command has been completed.
      ….
      Ответить
      • в смысле работает под линуксом?
        даже
        $ pause
        -bash: pause: command not found
        тем более в регистрозависимом unix окружении капслоком
        Ответить
      • http://msdn.microsoft.com/en-us/library/277bwbdz(v=vs.71).aspx
        The system function passes command to the command interpreter, which executes the string as an operating-system command. system refers to the COMSPEC and PATH environment variables that locate the command-interpreter file (the file named CMD.EXE in Windows NT). If command is NULL, the function simply checks to see whether the command interpreter exists.

        > Под линуксом и вендой работает.
        А откуда у вас в linux pause?!
        Ответить
        • > откуда у вас в linux pause
          Наверное, есть специальный дистрибутив Windux
          Ответить
          • http://www.linuxfromscratch.org/
            Ответить
            • Была мысль заняться этой хренью пару лет назад, но бог красноглазия повёл меня в другую сторону. Дальше gentoo дело не зашло.
              Ответить
              • > дальше gentoo

                А дальше и не надо.
                Ответить
        • >>А откуда у вас в linux pause?!
          http://books.google.com.ua/books?id=Qu6H8fnAvGoC&pg=PA450&lpg=PA450 &dq=how+to+emulate+pause+in+bash&source= bl&ots=ChhP6lqF22&sig=hBQIJN30oSbJil8ofu 5CrC0RY7g&hl=en&sa=X&ei=Q2D1T-GfNMWZ-wbltMjhBg&ved=0CFIQ6AEwAw#v=onepage&q=ho w%20to%20emulate%20pause%20in%20bash&f=f alse
          Ответить
          • Ну если так, то эту программу можно портировать на любую систему. Т.к. system() определен в стандарте, и достаточно лишь создать скрипт\исполняемый файл, названный pause...

            P.S. Движок ГК рассовывает пробелы в длинные ссылки ;(
            Ответить
            • Да, поплыла ссылка...

              Для Ъ:
              0) «Bash Cookbook: Solutions And Examples for Bash Users»
              ...
              17.23 Emulating the DOS Pause command
              ...
              pause () {
              read -p 'Press any key...'
              }

              1) Пишем скрипт, ставим права
              2) Делам симлинк на /bin/Pause
              3) $ cat /home/work/C99/pause.c
              #include <stdlib.h>
              #include <stdio.h>

              int main(int argc, char **argv )
              {
              printf("Hello, %s\n", &(argv[0])[2]);
              system ("Pause");
              return 0;
              }
              Ответить
              • > 2) Делам симлинк на /bin/Pause
                Пользователя lfs видно невооруженным взглядом.

                А если будет два таких умника, которым нужно будет немного различное поведение pause? Ну можно PATH экспортировать перед запуском - но костыли уже чувствуются отчетливее.

                Предположим, нужно будет локализовать, прикажете отдельный *.po для pause писать?
                Ответить
                • > Пользователя lfs
                  Непонятно еще кто кем пользуется - пользователь lfs, или lfs пользователем.
                  Ответить
                  • Да вроде нормальная система^Wкнижка - применение найти можно.
                    Скорее подкалывал по поводу помойки в bin, lfs пришлась к слову.
                    Ответить
                  • Вброс засчитан.
                    Ответить
                • >>...которым нужно будет немного различное поведение pause
                  http://bit.ly/LVDQ7K

                  >>Предположим, нужно будет локализовать прикажете отдельный *.po для pause писать?
                  По обстоятельствам.
                  Вообще же, не писал бы вовсе, как и локализацию для системных уведомлений,
                  для … «будь мужиком, учи английский, бле@ть»(с)
                  Ответить
                  • > http://bit.ly/LVDQ7K
                    Поясните мысль: что вы конкретно предлагаете?
                    Ответить
                    • Насколько 'немного различное' поведение вы ожидаете?
                      «UNIX way» жеж, не?
                      Ответить
                      • Эм.. А зачем тогда линку кидали, если аппелируете к схожести поведения?)

                        > «UNIX way» жеж, не?
                        Это, конечно, хорошо. И стоит ожидать одинакового поведения. Но оба вышеописанных "конкурента" могли бы добавить в виде префикса имя программы. И таки стоит ожидать, что любители system("pause") будут ценить unix-way?

                        Ну и, главное: допустим /bin/Pause уже есть. Просто погаться на то, что там нужное поведение или выделять пакет а-ля cmdexe-compat и ставить в зависимость (но это же не стандарт => проблема совместимости)?

                        Да и вообще: создается pause доступная снаружи, но используется только изнутри - не совсем комильфо.
                        Ответить
                        • >> Эм.. А зачем тогда линку кидали, если аппелируете к схожести поведения?)
                          «Немного другое поведение», можно осуществлять, за счёт параметров передаваемых скрипту.

                          >>И таки стоит ожидать, что любители system("pause") будут ценить unix-way?
                          Это у них спрашивать, чего от них ожидать.

                          >>Ну и, главное: допустим /bin/Pause уже есть.
                          О каких дистрибутивах мы говорим?
                          Документация, мейнтейнеры, стандартизация для конкреного дистра...вот это вот всё — что, кто, где, когда?
                          Фактически, /bin/Pause предназначена для одного - эмуляция досовской Pause, всё.

                          >>но используется только изнутри
                          $ Pause и system("Pause") - same result.
                          И причём тут 'только'?
                          Ответить
                          • > «Немного другое поведение», можно осуществлять, за счёт параметров передаваемых скрипту.
                            Спасибо, конечно, но чуть выше я попросил конкретный пример: что именно (и как) вы собираетесь передавать в данном случае.

                            > Это у них спрашивать, чего от них ожидать.
                            Тогда зачем: > «UNIX way» жеж, не? А так понимал, что вы пишите с точки зрения автора system("pause") или у него есть добрый мейнтейнер с совочком?

                            > Документация, мейнтейнеры, стандартизация для конкреного дистра...вот это вот всё — что, кто, где, когда?
                            То есть когда линк в /bin - все нормально, а когда шаг влево-вправо - уже ЧГК? Замечательно, чо.

                            Это же вас не смутила "кроссплатформенность" по отношению к сабжу. Или для вас "можно окостылить - и заработает" - уже кроссплатформенно?

                            > Фактически, /bin/Pause предназначена для одного - эмуляция досовской Pause, всё.
                            > И причём тут 'только'?
                            /0 или два стула?
                            Ответить
                            • Тема незаметно уходит в детали.
                              О главном:
                              1) использовать system(''Pause''); неразумно ибо слишком накладно.
                              2) для эмуляции DOS'овской Pause было предложено решение.

                              Прочее:
                              >>что именно (и как) вы собираетесь передавать в данном случае.
                              Передавать туда, пока что, ничего не собираюсь, но, указал на способ как это можно делать.

                              >>«UNIX way»
                              А «UNIX way» при том, что вы, спрашивали о 'немного различном поведение'.
                              Насколько различным должно быть поведения, что бы для его реализации было неразумно
                              использовать передачу параметром pause.sh?
                              Я пишу со своей точки зрения.

                              >>уже ЧГК?...
                              Вы меня совсем не поняли.
                              Если это дистрибутив типа убунты, то там, будет нужно и сопровождение и стандартизация поведения и прочее прочее. Если это серверная гента для маленькой такой компании, то
                              достаточно будет в _заметках_конфигурации_серванта_ оставить информацию
                              о костыле, что и как.

                              >>Или для вас "можно окостылить - и заработает" - уже кроссплатформенно?
                              Как мне представляется:
                              кроссплатформенность - стандартизированная эмуляция поведения систем на одни и те же вызовы.
                              Написание 'костылей' - не стандартизированная эмуляция поведения систем на одни и те же вызовы.

                              >> И причём тут 'только'?
                              Имелось ввиду то, что в своих скриптах, вы можете использовать данную эмуляцию как посчитаете нужным или не использовать совсем — вам решать.
                              Ответить
                              • > указал на способ как это можно делать.о
                                Безотносительно контекста, а два раза просил конкретно объяснить. Как передавать аргументы shell-скриптам я отлично знаю, интересно было как в случае system("PAUSE") или вы предлагали не ограничиваться pause - а менять в зависимости от платформы?

                                > Насколько различным должно быть поведения
                                Если со стороны пользователя (но это каждый отдельный пользователь будет окостыливать), то проблемы нет. Раз речь была о кроссплатформенности, я ожидал шагов на стороне автора программы.

                                > было неразумно использовать передачу параметром pause.sh?
                                Вот мне и было интересно куда параметры писать, вызывается-то из system. Неужели "PAUSE -key" (тогда изначальный смысл теряетсяд - раз все равно на уровне исходников менять)?

                                > кроссплатформенность - стандартизированная эмуляция поведения систем на одни и те же вызовы.
                                Учитывая, что pause - на линуксе не стандарт, вы имеете ввиду, что о портабелельности в контексте сабжа речи не идет, правильно ли понимаю?
                                Тогда не понятно, зачем было:

                                >>Кроссплатформенное решение
                                > Под линуксом и вендой работает.

                                Звучит же будто наоборот.
                                Ответить
                                • >>интересно было как в случае system("PAUSE")
                                  system("ls -al");

                                  >> Если со стороны пользователя
                                  Пользователь должен(если адекватен) прочитать ман и действовать в соответствии.
                                  Речь шла о поведении самой Pause, насколько разного поведения, от неё ожидаете увидеть вы. Указал на юникс вэй, как то обстоятельство, что не в широком диапазоне, должно быть это самое 'немного различном поведение' Pause, дабы реализовать его через передачу параметров.

                                  >>что о портабелельности в контексте
                                  сабжа речи не идет, правильно ли понимаю?
                                  Для чего вас так интересует портабельность, в данном случае?

                                  >>Учитывая, что pause - на линуксе не стандарт
                                  При каких тут ядро?
                                  Это вопрос к оболочке, баш, даш, кш и т. дш.
                                  Тем более, что read - is a BASH shell builtin.
                                  Вот тебе баш и ебаш install-DOS-Pause-emul.sh.

                                  Кроссплатформенность имеет 3 аспекта:
                                  1) Если чего-то нет - сиди жди когда стандартизирует какой-нибудь исо комитет и дистростроители возьмутся поддерживать;
                                  2) Дистростроители сами возьмутся, без всяких комитетов, ввиду объективной необходимости;
                                  3) Если чего-то нет - делаешь сам. Сам себе исо комитет, сам себе мейнтейнер.
                                  Ответить

    Добавить комментарий