Кресты / Говнокод #11361 Ссылка на оригинал

0

  1. 1
system("PAUSE")

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

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

Запостил: bormand bormand, (Updated )

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

    • Но он же не выводит надпись "Нажмите любую клавишу..."
      Ответить
        • Ошибка: клавиатура не найдена. Нажмите любую клавишу...
          Ответить
            • Bios нужно было просто верно настраивать, чтобы отсутствие клавы игнорил. Меня устроит и виртуальная клавиатура от сенсорного экрана или мыши.
              Ответить
              • > Bios нужно было просто верно настраивать
                Да настраивается то это легко (stop on - all but keyboard). Но пока гром не грянет - мужик не перекрестится...
                Ответить
              • Не очень хороший совет. Была ситуация, когда при выходе из спящего режима винда ХР из-за отошедших контактов мыши и клавиатуры (кто-то дернул кабеля) не подхватила ни то, ни другое, даже с последующими втыканиями-вытыканиями. Итог - вышедшая из спящего режима (с кучей программ за кадром) винда, висящая на окошке авторизации. Ни зайти, ни отправить обратно в спящий режим. Reset...
                Ответить
          • >Ошибка: клавиатура не найдена. Нажмите любую клавишу...
            Нажать клавишу мыши или reset достаточно?
            Ответить
    • И кстати, баян баяном, но в тех тредах обсуждались иные аспекты говнокодов, и не затронут собственно 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?!
      Ответить
        • Ну если так, то эту программу можно портировать на любую систему. Т.к. 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 писать?
                По обстоятельствам.
                Вообще же, не писал бы вовсе, как и локализацию для системных уведомлений,
                для … «будь мужиком, учи английский, бле@ть»(с)
                Ответить
                  • Насколько 'немного различное' поведение вы ожидаете?
                    «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) Если чего-то нет - делаешь сам. Сам себе исо комитет, сам себе мейнтейнер.
                                Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8