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

    +997

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    for (int z=NewArray[y-1];z<(NewArray[y]-1);z++)
                    {
                      AnsiString ts = IntToStr(z+1);
                      int inum = -1;
                      try{
                        inum = StrToInt(ts);
                      } catch(...) {}
    ..... //дальше inum не используется
                    }

    Завис надолго. Так и не понял, зачем автор преобразовывает ts обратно

    Запостил: dm-ua, 10 Февраля 2012

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

    • я начинаю догадываться почему тарас ненавидит с++ - дельфи с фигурными скобками выглядит беспредельно омерзительно
      Ответить
      • Кстати, и обратное верно - С++ с begin/end (а также без неявных преобразований типов, с контролем переполнения и кучей фишек для работы со структурами, и без ограничений на параметры шаблонов, то есть Ада) выглядит очень приятно. Значит, begin/end лучше, чем {}
        Ответить
        • опять ты про свои недошаблоны и киллир-фичи?
          на уймись уже
          http://hh.ru/applicant/searchvacancyresult.xml?text=ada


          по теме - если создавать С++ библиотеку общего назначения да еще и на все случаи жизни, совместимую с паскалём 20-летней давности, получается беспредельное говнище, позорящее С++ своим существованием
          инвалидизация программистов хуже бейсика, спасибо борланду
          Ответить
          • > если создавать С++ библиотеку общего назначения да еще и на все случаи жизни
            То можно за время её написания отрастить бороду.
            Ответить
            • > то можно за время её написания
              дважды перепродаться, чтобы хоть как то свести концы с концами
              Ответить
          • Чё такой злой?
            Меня забавляет, как проходящая мимо крестошколота минусует положительное упоминание begin/end.
            Можно долго спорить на субъективные темы, но есть объективный критерий: http://www.gamedev.ru/flame/forum/?id=156371

            Ну и конечно же, аргумент про миллионы мух.
            Ты начинал неплохо, спорил на серьёзные темы, а скатился до аргументации на уровне молодого крестопионера.
            Ответить
            • Питонисты и Маяковский смотрят на вас... снисходительно.
              Ответить
              • Питон - особая статья, я про него в той теме избегал спорить, потому что не знаю, что про него сказать
                Ответить
                • А также на вас снисходительно смотрят представители языков
                  Boo
                  F#
                  Nemerle c #pragma indent

                  Никого не забыл?
                  Ответить
                  • > Nemerle
                    Не нужен ;)
                    Ответить
                    • Не то чтобы я с вами был не согласен, но:
                      Таки обычно, когда говорят эту фразу - аргументов назвать не могут, но я все же спрошу:
                      Аргументы?
                      Ответить
                      • Вообще "не нужен" - дежурный ответ на любое упоминание этого изделия ;)

                        Ну а претензия самая обычная - этот язык не приблизит меня к решению моих задач. Мне бы просто быдлокодить, чтобы быстро писалось и легко читалось, для этого подходит Жаба. А Немерле предлагает то, чего я никогда использовать не буду - всякое метапрограммирование, паттерн матчинг и функциональщину. То есть, просто добавленную сложность.
                        Ответить
                        • > паттерн матчинг и функциональщину
                          > добавленную сложность
                          Мощные функциональные и гибридные языки - палка о двух концах. Они могут сделать тебя гораздо продуктивнее (и мотивированнее, кстати), а могут и утопить в сложности абстракций.
                          К сожалению, людей, способных к продуктивному использованию таких языков, довольно мало, причём большая часть этих людей не заинтересована в изучении и применении таких языков.
                          Программирование нынче становится социальным, и исходный код, как и любой продукт, предназначенный для массового потребления, должен быть понятен сотням людей с разным бэкграундом и образованием. И никого не волнует, что одна строка с map и reduce эффективно решает задачу и рудует глаз функциональщика, извольте писать циклом, так, чтобы все поняли.
                          по мне так всё это очень грустно.
                          Ответить
                          • > рудует глаз функциональщика
                            TODO: научиться писать для радования глаз функциональщиков.
                            Ответить
                          • Я бы и рад эффективно что-то там решать, но вот проблема - аргументы в пользу тотального перехода на функциональщину, такие как отсутствие глобального состояния и легкость параллельного программирования, являются притянутыми за уши. Они, как бы, вообще ложные, да и не стоит это того, чтобы бросать прям вот все наработки и переписывать их в функциональном стиле. Ну а абстракции типа map/reduce мне никто не мешает использовать в любом языке.
                            Ответить
                            • Для каждой задачи нужен свой инструмент. Сложные системы распределённых вычислений требуют инструментов, отличных от инструментов, удобных для построения простых сайтов или корпоративных систем.
                              Вы пробовали использовать map/reduce (не как архитектурное решение, а для простых вычислений), к примеру, в java? Отсутствие функций как объектов первого рода и лямбд делает использование абстракций map/reduce в обычном коде сопряжённым с огромным оверхедом, а следовательно, нежелательным.
                              Ответить
                            • К тому же, никто не утверждает, что состояния не должно быть. Без него программа не сможет вернуть результат. Приверженцы ФЯ просто предлагают явно обособлять код, требующий работы с состоянием, сохраняя по возможности большую часть кода чисто функциональным. STM в Clojure - яркий тому пример.

                              От себя скажу, что лисп-макросы и идея bottom-up programming, к примеру, меня очень впечатлили (гораздо больше, чем ООП в своё время). Возможность без особых заморочек изменить язык под свои нужды, сохранив при этом всю его мощь, очень вдохновляет.
                              Ответить
                  • Haskell забыл
                    Ответить
                • Скажу, в нем проблема скобочек решена радикально, но в результате 9/10 экрана пустует. За что боролись, на то и напоролись. :)

                  С нечитаемостью закорючек полностью согласен, сам часто глаза ломал. Но begin-ы, имхо, избыточны, т.к. всегда прилеплены к какой-то конструкции (началу функции, условию, циклу). Даже если не вдаваться в крайности типа значимости отступов, можно их безболезненно убрать, введя, например, правило автооткрытия блоков, если за всякими вайлами и ифами сразу на строке ничего нет. Ну и краткость будем считать сестрой таланта: "then" нафиг, procedure/function изволим звать "def" и будет все просто и лаконично. А не как эту срань Ada, где end-у нужно говорить, чей он.
                  Ответить
                  • > 9/10 экрана пустует
                    10 уровней вложенности? ведь иногда можно писать более одного def. Затраты на идентацию аналогичны затратам в других языках.
                    Ответить
                    • Не, с вложенностью все в порядке - так даже удобнее, если за экран ушло, значит говно. А вот то, что нельзя больше одной операции в строку уложить (т.к. нет разделителя) - неудобно. Поэтому питонисты любят длинные имена, чтобы дырок между строк меньше было :)
                      Ответить
                  • > А не как эту срань Ada, где end-у нужно говорить, чей он.

                    Зато если енд забудешь, то не будет по всему коду бегать и искать, где ты его забыл.
                    Опять вы про скорость набора говорите, а это дело последнее.
                    Ответить
                    • ты не поверишь, но ошибки "can't find trailing }" я последний раз видел еще только когда учился писать
                      с тех пор я написал миллион закрывающих скобок и не имел никакого батхерта
                      но раз программисты на аде не могут писать синтаксически корректный код с первого раза, то конечно пускай насилуют клавиатуру, скорость набора ведь дело последнее

                      а ведь дело в простом - как только ты при наборе текста ставишь открывающую скобку, ты (или среда) тебе сразу ставит закрывающую (это несложно делать и самому - скобки то соседние клавиши), затем ты нажимаешь один раз энтер и уже пишешь внутри блока {} и уже с отступами. Это же настолько очевидно. Тарас, почему у тебя проблемы с такими элементарными вещами?
                      Ответить
                      • Я тоже сначала пишу begin/end, а потом между ними. Но в процессе перелопачивания кода всякое может случиться.
                        Ответить
                        • среда не умеет за тебя это делать? сколько микросекунд у тебя уходит на набор 9 символов, размазанных по всей клавиатуре (ведь еще и ; надо), затем минимум ctrl+стрелка влево + энтер, и сколько уходит у меня на С++ (шифт + почти одновременно {} двумя пальцами + стрелка влево + энтер)
                          в процессе перелопачивания кода нормальная IDE всегда покажет matched brackets жирным, а mismatched brackets красным, скобка обязана закрыться на той позиции, где начинался её блок, положением блока легко управлять выделение + таб/шифт-таб

                          редактор твой друг, ни с++ ни паскаль в блокноте писать не нужно, это сразу снижение производительности труда в 10 раз

                          и да, за уровни вложенности, начинающиеся на середине экрана, надо нещадно пиздить в любом языке
                          Ответить
                          • > скобка обязана закрыться на той позиции, где начинался её блок
                            Мне это утверждение кажется очевидным. Меня всегда терзал вопрос, что, ЧТО курили авторы GNU coding style.
                            Интересуюсь, чтобы случайно не выкурить того же
                            Ответить
                          • На набор 9 символов у меня уходит очень мало, и всё равно скорость набора - последний фактор при написании программы.
                            Ответить
                    • В нормальной функции обычно не более 20-30 строк. Что тут можно забыть? И вообще, может я оформляю код так, чтобы не забывать? А скорость набора тоже важна, как бы ни были мощны компьютеры, у меня пока не было ни одного, который бы работал быстрее мысли :)
                      Ответить
                      • > В нормальной функции.

                        Ну не всегда получается так, как надо.
                        Ответить
            • ой Тарас, тема с begin/end vs {} будет явно не в пользу паскаля/ады, т.к. {} короче begin/end, а переносы строк в питоне короче {}

              и да, код, написанный тобой для примера - херня, потому что 1) после } точка с запятой не нужна, 2) использовать константы капслоком (небось задефайненные) - это тебе в сишечку, 3) лично я в for/if/etc предпочитаю египетский стиль, 4) ты заведомо выбрал разные шрифты с разным интервалом и с разной констрастностью, тема про шрифты уже поднималась и хуже курьера, на мой взгляд, сложно что то найти, но твой пример у меня выглядит так http://db.tt/XpP6fjzi - у тебя проблемы с поиском отступов?, 5) т.к. ты привел разные по содержанию примеры, я попытался воспроизвести твой дельфишный пример на С++ и пришел к неутешительному выводу, что твой код - реальный кал.
              Об этом поподробней.
              Ты написал явно какой то хендлер (наверное, ввод с клавиатуры), и в нем пытаешься засунуть введенный символ в (самописный?) edit. Ок. Ты вызываешь (глобальную? sic!) функцию EditInfoPtr, которая тебе как бы должна вернуть указатель на твой эдит (корректность указателя?), после чего, вместо того, чтобы передать объекту эдита задачу "съешь вот этот символ да выпей чаю и изменись", ты отбираешь у него его работу - получаешь контекст, затем работаешь с данными эдита (S?), при этом применяешь стрёмные махинации с (непустотой?) данных - типа если в первый раз, то заводим первую строку? - после чего ты управляешь данными эдита, смещаешь курсор, видать, перерисовываешь - в общем, у меня рука не поднялась воспроизводить этот OOP-hater кал. Знаешь, инкапсуляция - это объединение данных и методов работы с этими данными под одной крышей - классом - и такую простую вещь поддерживает даже ООП реализация в дельфи, пробуй!

              ЗЫ как видишь, ты тоже пользуешь египетский стиль, не вижу чем 9 символов "begin" "end;" в этом случае имеют преимущество перед двумя {} - как и ненужные "procedure", "var"
              подумай над этим
              Ответить
              • ну а пока у кого-то батхерт, что он несогласен, но пока боится сказать в чем, я реквестирую код на дельфи, аналогичный приведенному - т.е. вывод в некий буфер данных game.data(i, j) построчно тем же образом - продемонстрируешь читабельность и компактность кода, очевидно, похвалишься
                Ответить
                • >продемонстрируешь читабельность и компактность кода, очевидно, похвалишься
                  вы такой индивидуальной величиной решили оперировать? а не пойти ли вам нахуй в таком случае?
                  Ответить
                  • ох ничего себе какой дерзкий паскалоед
                    малыш, читай тред внимательней
                    > http://www.gamedev.ru/flame/forum/?id=156371
                    > Соломон Страуструбер - виртуал тараса
                    > "но всё-таки самый важный параметр - читаемость кода."
                    я так и не дождался
                    Ответить
                    • показать все, что скрытону и он тогда пошел нахуй. оба идите.
                      Ответить
                      • я обычно таких блохастых шавок пинаю под дых и иду дальше, пока они в мечтах о важности своего мнения слюняво тяфкают из подворотни, вместо того, чтобы привычно жрать картофельные огрызки из помойки
                        ты что, ошибся разделом, кобелёк? где твой хозяин? он тебя выкинул на улицу как только ты ему нагадил в ботинки? приезжай в москву, тут собакам делают уколы, отчего они хоть и становятся бесплодными, но очень жирными и спокойными
                        Ответить
                        • Хренли ты злой такой?
                          У нас на говнокоде атмосфера всеобщей любви и радости, вообще-то.
                          Ответить
                          • почему злой
                            его что, кто то приглашал отвечать на вопрос, что был направлен лично тебе? причем демонстрируя такую глубину адекватности
                            если ты таким образом думал руками виртуала соскочить с темы "да я ща всем покажу божественный код с двумя отступами и жирными begin end;", то ты скажи, я пойму
                            Ответить
                          • ЛУЧИ ГОВНА В ТРЕД!!!
                            Ответить
                        • А в своем глазу бревна ты не заметил? Харе кудахтать
                          Ответить
                      • и ты тоже иди на хуй. все идите!
                        Ответить
              • > ой Тарас, тема с begin/end vs {} будет явно не в пользу паскаля/ады, т.к. {} короче begin/end

                Ну и что? Но крестошколоте и этого достаточно, чтобы, радостно повизгивая, подплюснуть.

                > Ты вызываешь (глобальную? sic!) функцию EditInfoPtr

                Не понял, а чё, в крестах вообще бывают другие функции?

                > после чего, вместо того, чтобы передать объекту эдита задачу "съешь вот этот символ да выпей чаю и изменись", ты отбираешь у него его работу

                Потому что я и делаю за него всю работу, потому что встроенные средства делают эту работу не так, как я хочу.

                > Знаешь, инкапсуляция - это объединение данных и методов работы с этими данными под одной крышей - классом - и такую простую вещь поддерживает даже ООП реализация в дельфи, пробуй!

                Куда их объединять, у меня и так всё в конечном итоге сводится к вызову функции "сделать правку", принимающей хитрую структуру, и делающие все операции над буефром правок. Ты этого не знал, но посрать всё равно решил.

                У меня баттхёрт от того, что я спорю с мудаком и 95% долбоёбов на его стороне.
                Ответить
                • > в крестах вообще бывают другие функции
                  прикинь, еще бывают статические и нестатические члены класса.
                  > потому что встроенные средства делают эту работу не так - VCL настолько убога, что невозможно отнаследоваться от эдита и переопределить лишь необходимые вещи? Это конечно весело, но врядли правда.

                  > хитрую структуру
                  вот в этой хитрой структуре (editinfo видимо) тебе и нужно было сделать метод, принимающий inserting_symbol и в нем 1) делать выделение первой строки в буфере при первом использовании (кстати почему не сразу, при создании, экономишь 16 байт на объект?) 2) не сравнивать допустимость caret.line - консистентностью объекта обязан заниматься сам объект, должно быть предельно ясно, что при любом вызове editinfo.insert_symbol каретка находится в нормальном состоянии 3) называть поля и методы так, чтобы не возникало вопросов - например, caret.symbol -> очевидно caret.pos (судя по коду ты инкрементируешь позицию, а не символ каретки), S -> lines, Larged (Увеличенный? чзх) -> я тут затрудняюсь, но походу он перерисовывает (одну?) строку на контексте - вот как раз вот этот вот метод может сам внутри получать и освобождать контекст.
                  Вот видишь, ты вроде бы похвалился своим кодом, а вышло не очень круто.
                  Ответить
                  • > прикинь, еще бывают статические и нестатические члены класса.

                    А что такое функция-член класса? Это тоже глобальная функция, которая первым параметром принимает указатель на объект. И в Аде, что самое интересное, допускается записывать один и тот же метод как A.DoSmth, так и DoSmth(A). Зато при объявлении метода удобно ставить, изменяется ли объект в методе - просто модификатором при первом параметре.
                    Так вот EditInfoPtr(H) - это, считай, функция EditInfoPtr() класса HWND, если тебе нравится. Можешь мысленно видеть вместо ней H.EditInfoPtr().

                    > настолько убога, что невозможно отнаследоваться от эдита

                    Чё, самый умный?
                    Молодой человек, вы когда-либо наследовались от Едита? Мне кажется, что нет, потому что иначе бы вы поняли, почему я от него не наследуюсь.
                    Так вот - в нём обработчик WM_CHAR вызывает отрисовку окна, причём напрямую, а не через WM_PAINT. Если перехватишь WM_PAINT, то ты сможешь изменить только отрисовку каретки.

                    > не сравнивать допустимость caret.line - консистентностью объекта обязан заниматься сам объект

                    Пилять, а у меня сам объект и занимается.
                    H.InsertSymbol(Code)
                    Объект H, метод InsertSymbol.
                    Всё оопешно, проблемы?

                    > вот в этой хитрой структуре (editinfo видимо) тебе и нужно было

                    Нет, структура для правки называется TCorrection. Да, и в неё я в итоге всё и перенёс. Там в теме был промежуточный вариант кода.
                    Ответить
                    • > Всё оопешно, проблемы?
                      конечно, перемещение каретки обязаны быть согласованы с состоянием объекта, именно поэтому caret в нем обязан быть приватным полем, а перемещением должны заниматься отдельные методы (хотя бы set/forward/backward/up/down).
                      а так твой код выглядит будто сантехник вася из подворотни в любой момент может тебе обычным присвоением caret.line = 100500 сделать, а ты типа к этому готов
                      Ответить
                      • > именно поэтому caret в нем обязан быть приватным полем

                        А оно и есть приватное поле этого EditInfoPtr, и обращаюсь я к нему внутри метода объекта. Снаружи к нему доступа нет, очевидно.
                        Хотя, конечно, запретить напрямую обратиться по указателю на это поле я не могу, ну так это везде так.
                        Ответить
                        • >запретить напрямую обратиться по указателю на это поле я не могу, ну так это везде так.
                          хакиры
                          Ответить
                • Э, плюсовать меня тоже не надо! У нас серьёзный разговор, я буду с помощью виртуалов сохранять обстановку нейтральности.
                  Ответить
                • показать все, что скрыто>> Не понял, а чё, в крестах вообще бывают другие функции?
                  Ты про отсутствие модульности?

                  >>У меня баттхёрт от того, что я спорю с мудаком и 95% долбоёбов на его стороне.
                  ахаха
                  Ответить
                  • показать все, что скрытоВ некоторых ЯП бывают вложенные функции.

                    В gcc например, расширили Си и даже разрешили брать указатель на вложенную функцию, ради чего нахуевертили трамплины, пробивающие брешь в защите.

                    В Паскале есть вложенные функции, по совместительству являющиеся замыканиями, захватывающими весь локальный конь-текст, но вот указатели на них брать нельзя.

                    Ах, да, в новых крестах (с C++11) есть лямбды, даже с захватом по выбору, а не всего подряд.
                    Ответить
                    • В "Си" можно сделать "функции" в функции без всяких расширений https://ideone.com/yqAHZq
                      Ответить
                      • показать все, что скрытоМокросами? Mocros are evil.
                        Ответить
                        • Можешь без макросов, но тогда будет малость вербозно. По-сути "функцию" в функции можно имплементнуть конечным автоматом со стеком внутри (это если "функция" должна вызывать другие такие "функции" и уметь в рекурсию. Если "функции" это не надо, можно тупо написать код)
                          Ответить
                          • показать все, что скрыто>> имплементнуть конечным автоматом со стеком внутри
                            у меня в машине Тюринга нет никаких "функций", а написать на ней можно что угодно
                            Ответить
                        • показать все, что скрытоВ гомосячем языке "JS before ES6" модульность реализовывали door middel van приватные функции
                          Ответить
                  • показать все, что скрыто>>У меня баттхёрт от того, что я спорю с мудаком и 95% долбоёбов на его стороне.

                    Конечно, лучше, когда 95% долбоёбов на твоей стороне.
                    Ответить
              • > египетский стиль
                Как у фараонов - лежишь без внутренностей в пирамиде.
                Ответить
            • Я тоже хочу вынести порицание.
              Я бы даже был согласен писать be/en, но на каждый уровень вложенности писать по восемь символов - перебор. Более того, будь у меня свой язык, со шлюхами и свистелками, там бы блоки я выделял через [ ]. Ибо они пишутся в стандартной раскладке без шифта.
              Ответить
              • > я выделял через [ ]
                Чой-то сразу вспоминяется Objective недокресты
                Ответить
              • Зачем вообще какие-то новые операторные скобки, если есть ()?
                Ответить
                • Ну так я бы делал не лисп, а более традиционный си-подобный язык. Плюс, как я уже говорил выше, если забить на лишнее нажатие на шифт, можно обойтись {}.
                  Ответить
                  • Традиционный как Алгол?

                    Никакой причины вводить новый вид скобок для этого в Си не было.
                    Ответить
        • Православны только нач/кон.
          Ответить
      • С точки зрения типографии, С++ выглядит так, как будто текст был набран в другой кодировке, а потом просто не нашлось нужных символов его напечатать. Типа как PHP кириллицу обычно выводит :) Типография, это в том числе и исследование о том, как и что лучше воспринимается, какой процент выносных элементов или прописных букв оптимален, какая оптимальная длина слова или строки и т.п. Компьютеры очень сильно изменили (и не в лучшую сторону) читаемость текстов (размеры и рисунок букв, длина строки, текст без переносов, всякие извращения с непропорциональным изменением текста...) Но в С++ хуже то, что он использует символы, которые в "естесственной" ситуации либо вообще не встречаются, либо не могут стоять рядом, либо вообще синтетические, либо не те, которые нужны (ну, это общее для всех ЯП - вместо минуса все пишут дефис...). Например, подчерк - это вообще не типографский символ, два двоеточия подряд не возможны ни в одном естесственном языке - соответственно, люди, которые разрабатывают шрифты и не предвидят такие ситуации.
        Ответить

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