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

    0

    1. 1
    reinterpret_cast<ppu_function_t>(static_cast<std::uintptr_t>(ppu_ref<u32>(cia)))(*this);

    Лопни глазоньки. Шаблоны увечат С++ как бог черепаху.
    https://github.com/RPCS3/rpcs3/blob/91d06a97296e5e418fb601284577475d8c7dfbaf/rpcs3/Emu/Cell/PPUThread.cpp

    Запостил: Psionic, 21 Мая 2020

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

    • I Cast A Spell on You.mp3
      Ответить
    • Где здесь C++ шаблоны, Psionic?!
      Ответить
      • на 73-й строке

        ну хотя вообще
        ppu_ref<u32>
        этож тоже шолбон?
        Ответить
      • В одной строке вижу 3 использования шаблонов.
        Ответить
        • reinterpret_cast рази шоблон?
          Ответить
          • Почему нет?
            Ответить
            • Я думал, это конструкция языка такая..
              Ответить
              • Да, *_cast — это не шаблон, это коньструкция крестов.
                Ответить
                • а ppu_ref -- шаблон?
                  Ответить
                  • Шаблон. Но не шаблоны!
                    Ответить
                    • а вот не факт
                      https://www.reddit.com/r/rust/comments/5penft/parallelizing_enjarify_in_go_and_rust/dcsgk7n/
                      Ответить
                      • they're characters from the Canadian Aboriginal Syllabics block

                        Oh my god
                        Ответить
                        • Так ведь можно сделать на любом языке программирования, который поддерживает Unicode в идентификаторах:
                          <?php
                          define('ImmutableTreeListᐸElementTᐳ', 'Кукареку');
                          
                          echo ImmutableTreeListᐸElementTᐳ;
                          echo PHP_EOL;

                          https://ideone.com/86UCZ3
                          Ответить
                          • Какой багор )))
                            Именно поэтому я за «PHP».
                            Ответить
                            • Можно использовать знаки препинания из других языков.
                              Греческие: ʹ ; ´ ῀
                              Армянские: ։ ՛
                              Из языков упомянутых канадских аборигенов: ᐀ ᐟ ᐥ ᐦ ᐸ ᐳ
                              Корейско-японско-китайские: 〓 〈 〉〜 〞 〳 〵
                              Лису: ꓸ ꓹ ꓼ ꓽ ꓿

                              Можно использовать пробелы и тире нестандартной ширины (всякие «en quad», «em dash»), компиляторы их не будут воспринимать как разделители.

                              Вот примеры годноты: ‑ ‒ – ’ ‚ ” ․ ‥ … ′ ″ ‹ › ‼ ⁄ ⁇ ⁈ ⁎ ⁒ ⁓ ⁚ ⸨ ⸩ ⹀

                              Есть годные математические операторы: ∶ ∼ ≪ ≫ ≺ ≻⋆ ⟨ ⟩ ⟮ ⟯ ⧾ ⧿
                              Есть хитрые скобки: ⎨ ⎬
                              Есть просто палки: │ ─ ╱ ╲
                              В «dingbats» тоже можно покопать: ❓❗ ❜ ❞ ❟ ❨ ❩ ❬ ❭ ❴ ❵ ➕ (жаль, некоторые символы выглядят жирнее, чем обычные)
                              Полноширинные версии символов: ︐ ︓ ︔ ︕ ︖ ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~

                              Уменьшенные версии символов: ﹐ ﹒ ﹔ ﹕ ﹖ ﹗ ﹘ ﹙ ﹚ ﹛ ﹜ ﹟ ﹠ ﹡ ﹢ ﹣ ﹤ ﹥ ﹦ ﹨ ﹩ ﹪ ﹫

                              Если Unicode в идентификаторах поддерживается, то из этих символов можно составить идентификаторы, напоминающие фрагменты кода на других ЯП.
                              Ответить
                              • 0 ╱ ╲ 0
                                Ответить
                                • <?php
                                   
                                  define('int main(){printf("Hello, world\n");}', 'Hello, world');
                                   
                                  echo
                                   
                                  int main(){printf("Hello, world\n");}
                                   
                                  ;


                                  https://ideone.com/jehRyq
                                  Ответить
                              • (+/%#)
                                Ответить
                              • #include <stdio.h>
                                main(){char*main(){char*s="main(){char*s=%c%s%c;printf(s,34,s,34);}";printf(s,34,s,34);}="main(){char*main(){char*s="main(){char*s=%c%s%c;printf(s,34,s,34);}";printf(s,34,s,34);}=%c%s%c;printf(main(){char*s="main(){char*s=%c%s%c;printf(s,34,s,34);}";printf(s,34,s,34);},34,main(){char*s="main(){char*s=%c%s%c;printf(s,34,s,34);}";printf(s,34,s,34);},34);}";printf(main(){char*s="main(){char*s=%c%s%c;printf(s,34,s,34);}";printf(s,34,s,34);},34,main(){char*s="main(){char*s=%c%s%c;printf(s,34,s,34);}";printf(s,34,s,34);},34);}
                                Ответить
                                • Не читаемо. Не в одну строку можно?
                                  Ответить
                                • Выглядит, как куайн.
                                  Ответить
                                  • Только если инклуд убрать, я его ничаянно запостил.
                                    Ответить
                                    • У меня сломался мозг, когда я пытался распарсить этот код.

                                      Ты Нидлесс. Больше никто с «Говнокода» не сможет такое написать.
                                      Ответить
                                      • Будем щитать ты меня раскусил

                                        Да, ручками его разобрать сложно, но на самом деле кот тупой:

                                        Сперва я написал самый короткий и тупой кууайн который знаю:
                                        main(){char*s="main(){char*s=%c%s%c;printf(s,34,s,34);}";printf(s,34,s,34);}

                                        Потом я заменил в нём спецсимволы так, чтобы шланг его целиком проглотил как один идентифир:
                                        main(){char*s="main(){char*s=%c%s%c;printf(s,34,s,34);}";printf(s,34,s,34);}
                                        К сожалению он не хавал nbsp поэтому у main тип не указан.

                                        Далее я просто заменил имя переменной s в первом куайне на эту хуйню.
                                        Ответить
                                  • Почти любой код на "PHP" без "<?php" - куайн.
                                    Ответить
                          • плюсы, питон, ди не разрешают короткий пробел в идентификаторах
                            Ответить
                      • как же без шаблонов извращаются с внешней кодогенерацией
                        Ответить
                        • Шаблоны, кодогенерация какая-то... Мы в джаве просто пишем одно и тоже руками семь раз и не жужжим.

                          Чай руки не отвалятся
                          Чай не сахарные
                          Ответить
                          • копипаста рулит да ошибочки плодит
                            Ответить
                            • Значит, нужно быть аккуратным.

                              Большинство Java программистов не достаточно умны, чтобы освоить такие сложные инструменты, как шаблоны (или const, например).

                              Однако они достаточно аккуратны, чтобы правильно и без ошибок написать много одинакового вербозного кода.
                              Ответить
                              • А в «PHP» не надо ничего копировать: там в функцию можно передать значение любого типа. Если нужно, интерпретатор сам преобразует число в строку или строку в число, и даже ругаться не будет.
                                Ответить
                                • В джаваскрипте тоже удобно.

                                  Например, в выражении
                                  "foo" + {}

                                  Джаваскрипт удобно представит "{}" как "[object Object]".

                                  Зато в
                                  {} + "foo"

                                  уже получится число с плавающей точкой, точнее число NaN.
                                  Ответить
                                  • У меня какой-то шайтан: последний пример показывает NaN, а если взять в круглые скобки, то показывает "[object Object]foo".
                                    Ответить
                                    • а теперь проверь в разных браузерах
                                      Ответить
                                      • Воспроизводится.

                                        А если поменять плюс на минус, то всегда будет NaN, даже в скобках.
                                        Ответить
                                    • Тебе же написали, что нужно быть Програмистус Какус: знать охулион тонкостей.

                                      Это, конечно, касается языков типа JS
                                      Ответить
                                      • Игры с JS мне напоминают игры с микрокалькуляторами.

                                        https://ru.wikipedia.org/wiki/Еггогология
                                        Ответить
                                        • >еггог
                                          была в децтве книжка
                                          http://xn--b1aph9d.xn--p1ai/biblioteka/cartochki/0021.htm
                                          ?
                                          Ответить
                                        • вот и про еггог
                                          http://эквм.рф/biblioteka/jurnal/klip/error.djvu
                                          Ответить
                                          • Игра «Автогонки» в качестве руля использует переключатель «градусы-радианы-грады». Программа считает косинус константы (100) и по результату вычисления определяет положение переключателя. Косинус ста град будет равен нулю. Кстати, грады вообще где-нибудь используются или их по приколу в микрокалькуляторы ввели? Косинус ста градусов будет отрицательным, косинус ста радиан будет положительным (100 ≈ 30π + 5,75).

                                            Какой скилл )))
                                            Ответить
                                            • Пишут что в геодезии юзается. Х.з. зачем правда он нужен. Углы в 30 или 60 градусов в градах красиво не запишешь.
                                              Ответить
                                              • Мне нравится, как указывают уклон дороги на знаках: там пишут синус угла, умноженный на 100%. Углу в 30° будет соответствовать уклон 50%.
                                                Ответить
                                                • Хм, т.е. 100% уклон это стена?

                                                  З.Ы. Не ну довольно удобный показатель, типа каждые 10 метров высота растет на пять.
                                                  Ответить
                                                  • Так точно!
                                                    Ответить
                                                  • > За 100% стоит считать уклон в 45 градусов, а тангенс 45 градусов равен 1. Если уклон дороги составляет 7 градусов, то тангенс 7 градусов - это 0,12, вот поэтому 12% и пишут на знаке.

                                                    https://kuruh.ru/krutoy-spusk
                                                    Ответить
                                                    • Интересно. В одних местах пишут, что нужно считать синус (перепад высоты делить на пробег по дороге), в других местах пишут, что считать нужно тангенс (перепад высоты делить на расстояние на карте между точками).

                                                      Кому верить?
                                                      Ответить
                                                      • Тангенс правильно. 100% - это угол 45 градусов.
                                                        Ответить
                                                        • А по-моему синус тут интуитивнее. Ты же едешь по гипотенузе а не под землей по нижнему катету.
                                                          Ответить
                                                          • Я не знаю в чём логика, но помню в автошколе говорили так.
                                                            Ответить
                                                        • К вопросу о гипотенузе и катетах

                                                          https://lyrics.primanota.ru/xui-zabei/treugolniki.htm
                                                          Ответить
                                                          • Вот именно. Хуй забейте на эти синусы и тангенсы.
                                                            Ответить
                                                      • Я думаю, за рулём ничего считать не надо, а просто помнить, какие у тебя покрышки, и соотносить проценты на знаке с погодными условиями.

                                                        С другой стороны, я вообще не понимаю, что мешало тогда ввести классификацию спусков и подъёмов типа A B C D вместо процентов?

                                                        Вот в этих ваших омериках, например, пиктограммы на дороге не особо в почёте, всё стараются писать словами. И ничего, piosa nie popierdolilo
                                                        Ответить
                                                        • Потомушо омериканцы тупые
                                                          Ответить
                                                        • > пиктограммы на дороге не особо в почёте, всё стараются писать словами
                                                          Мозг американца разработан настолько, что в него с детства легко помещаются номиналы монет вида "медяк", "полтос", "четвертак", "золотник", ключи на 1/12, 1/6, 1/2, 3/4 и фунты на квадратный дюйм.
                                                          А значит рассматривать Америку как пример использования какого-то решения - дело бесполезное.

                                                          Насколько я помню, в США нет державной мовы. Это значит, что писать там что-то словами - неудачная идея.
                                                          Ответить
                                                      • Или что мешало не синусы и тангенсы считать, а просто разделить изменение высоты на длину участка?
                                                        Ответить
                                                        • Разделить высоту на длину - это и есть тангенс.
                                                          Ответить
                                                          • OH SHI~

                                                            Спасибо, я сам проведу себя к выходу.
                                                            Ответить
                                                        • Я выше написал, что длины бывает две:
                                                          1. Если делим на пробег по дороге, получаем синус.
                                                          2. Если делим на расстояние между точками на карте, получаем тангенс.
                                                          Ответить
                                                          • Ладно, похуй.
                                                            Ответить
                                                            • В принципе, до 10° разница между синусом и тангенсом не настолько велика, чтобы её заметить.

                                                              sin 9° ≈ 0,156.
                                                              tg 9° ≈ 0,158.

                                                              На дорожном знаке всего две цифры. В обоих случаях можно написать 16%.

                                                              Разница будет заметной после 30°, но такой уклон невооружённым взглядом выглядит «пиздец как много».
                                                              Ответить
                                                              • Томушо первый замечательный предел: sin(x) = о(x)
                                                                Ответить
                                                                • >предел

                                                                  сразу видно, что ты из аркши
                                                                  Ответить
                                                                • Правильнее будет так: sin(x)/x - 1 = o(x).

                                                                  Тут x, естественно, в радианах.
                                                                  Ответить
                • А вызов шаблонной функции - это не коньструкция крестов?
                  Ответить
                  • Ты путаешь понятия. Вызов функции (любой) — это коньструкция крестов, но это (очевидно) не «шаблон».
                    https://en.cppreference.com/w/cpp/language/templates
                    A template is a C++ entity that defines one of the following:
                    
                    a family of classes (class template), which may be nested classes
                    a family of functions (function template), which may be member functions
                    an alias to a family of types (alias template) (since C++11)
                    a family of variables (variable template) (since C++14)
                    a concept (constraints and concepts) (since C++20)
                    Ответить
                    • ладно, похуй
                      Ответить
                      • нет, не похуй.

                        Шаблон это такая конструкция языка, которая описывается с помощью ключ слова template, и которую компилятор инстанциириует превращая в код.

                        cast, очеведино, с помощью ключ слова template не описан
                        Ответить
                        • ладно, похуй
                          Ответить
                          • нет, не похуй.

                            Шаблон это такая конструкция языка, которая описывается с помощью ключ слова template, и которую компилятор инстанциириует превращая в код.

                            cast, очеведино, с помощью ключ слова template не описан
                            Ответить
                            • ладно, хуй с ними
                              Ответить
                              • нет, не хуй с ними

                                Шаблон это такая конструкция языка, которая описывается с помощью ключ слова template, и которую компилятор инстанциириует превращая в код.

                                cast, очеведино, с помощью ключ слова template не описан
                                Ответить
                                • Да хуй с ним, все уже поняли.
                                  Ответить
                                  • нет, не хуй с ними…
                                    Ответить
                                    • а чё так?
                                      Ответить
                                      • Шаблон это такая конструкция языка, которая описывается с помощью ключ слова template, и которую компилятор инстанциириует превращая в код.

                                        cast, очеведино, с помощью ключ слова template не описан
                                        Ответить
                                        • > очевидно

                                          А ведь их можно запилить и самому через темплейты и какую-нибудь низкоуровневую магию в духе сишного каста.
                                          Ответить
                                          • Да в общем-то и без магии можно, как-то так (на правильность не проверял):
                                            template<typename To, typename From>
                                            To my_reinterpret_cast(const From & val) { return (To)val; }

                                            И да, my_reinterpret_cast как раз будет шаблоном (т.е. именем шаблонной функции). В отличие от static_cast, const_cast, dynamic_cast и reinterpret_cast.
                                            Ответить
                                        • а, ну с этим ладно
                                          Ответить
                                          • нет, не ладно
                                            Шаблон это такая конструкция языка, которая описывается с помощью ключ слова template, и которую компилятор инстанциириует превращая в код.

                                            cast, очеведино, с помощью ключ слова template не описан
                                            Ответить
                                            • в пизду шаблоны
                                              Ответить
                                              • нет, не в пизду

                                                Шаб
                                                Ответить
                                                • > нет, не в пизду

                                                  Обоснуй
                                                  Ответить
                                                  • Шаблон это такая конструкция языка, которая описывается с помощью ключ слова template, и которую компилятор инстанциириует превращая в код.

                                                    cast, очеведино, с помощью ключ слова template не описан
                                                    Ответить
                                                    • Шаблоны не нужны.
                                                      Ответить
                                                      • Обоснуй
                                                        Ответить
                                                        • Он пишет на "PHP" где нет никаких шаблонов и течет.
                                                          Ответить
                                                        • Есть ещё возражения?
                                                          Ответить
                                                          • Конечно, есть

                                                            Шаблон это такая конструкция языка, которая описывается с помощью ключ слова template, и которую компилятор инстанциириует превращая в код.

                                                            cast, очеведино, с помощью ключ слова template не описан
                                                            Ответить
                        • > очевидно

                          Кстати, некоторые касты таки описаны через template. К примеру boost::lexical_cast<> или qobject_cast<>.
                          Ответить
                          • Ага. А ещё в «C++20» завезли «std::bit_cast», и теперь можно без UB байтоёбить целое в плавпитуха и обратно: https://en.cppreference.com/w/cpp/numeric/bit_cast!
                            Ответить
                          • >некоторые касты таки описаны через template

                            те, котоые не являются частью языка

                            например, boost.
                            Ответить
                          • Как им пришла в голову идея сделать спецконструкцию языка синтаксически таким же, как шаблонный вызов?
                            Ответить
                            • Надо было добавить 100501-ю коньструкцию и пятый вид скобок?
                              Ответить
                            • В Си и в C++ символы и ключевые слова переиспользуются, насколько это возможно.

                              Кто сходу вспомнит, для чего использовалось слово «static»?
                              Ответить
                              • Это другое дело, когда раньше был один смысл, а теперь другой. Например, auto.
                                Ответить
                                • Хорошо, тогда другой пример:
                                  a < b, c > d;

                                  Это могут быть два сравнения (просто так), а может быть объявление переменной d шаблонного типа a<b,c>.
                                  Ответить
                                  • Как эту питушню разруливает парсер и подобная питушня?
                                    Ответить
                                    • Элементарно: если «a» — это имя типа, то парсим как шаблон, если «a» — переменная, то парсим как сравнения. Ну или какими-то другими эвристиками в этом духе.
                                      https://gcc.godbolt.org/z/6K6CVV
                                      Ответить
                                      • Ну всё, теперь всё ясно, могу хоть сейчас идти парсеры писать.

                                        Настолько простые правила парсинга - как на картинке: https://lurkmore.so/images/2/2a/%D0%9D%D0%B0_%D1%81%D0%BB%D0%BE%D0%B2%D0%B0%D1%85_%D1%82%D1%8B_%D1%85%D1%83%D0%B9_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B9.jpg
                                        Ответить
                                        • Паскуда, вы когда уже научитесь ссылки правильно вставлять? https://lurkmore.so/images/2/2a/На_словах_ты_хуй_простой.jpg
                                          Ответить
                                          • Зачем ты вскрыл спойлер?
                                            Ответить
                                            • Закрыл спойлер обратно, проверь:
                                              https://lurkmore.to/_/26967

                                              Оказывается, движок «Mediawiki» для картинок тоже создаёт «wgArticleId».
                                              Ответить
                                          • Какой грубый
                                            Ответить
                                        • питушня
                                          Ответить
                                          • На самом деле это - легкие людей, умерших от пневмонии.
                                            Ответить
                                      • Обычно же кукарекают про КС-грамматики и сложности для парсинга всего того, что в них не входит. Нормальные КС-питух не очень подойдёт, его надо как-то хитро доработать, чтобы он по пути собирал нужную информацию. Вот это и интересно.
                                        Ответить
                                    • Для этого во время парсинга нужна инфа о типах. Скорее всего в конпеляторах проверка типов смешана с этапом синтаксичского разбора.

                                      То ли дело жс, там даже на этапе лексического аналолиза нужно знать в каком месте выражения мы находимся: "/" обозначает деление, начало регулярного выражения, или надо посмотреть вперёд на проверку наличия "*" или "/", чтобы узнать что это коммент?
                                      Ответить
                                      • > даже на этапе лексического аналолиза нужно знать в каком месте выражения мы находимся
                                        Какой багор )))
                                        Но это хотя бы КС-питух должен склевать.
                                        Ответить
                                  • _Generic(x, int: "integer", double: "floating point", default: "something completely different")
                                    Ответить
                                  • Так а что ты хочешь мне сказать? Что это адекватно, сначала сделать контекстно-зависимую грамматику, а потом ещё сверху полирнуть эмуляцией некоторых случаев?
                                    Ответить
                                    • Нет, конечно. Я против такой контекстной зависимости, потому что даже самому свой код тяжело разбирать.

                                      Я хочу сказать, что для C++ такое положение вещей — норма.
                                      Ответить
    • Поясните, что це за говно ?
      Ответить
    • гавно шаблон - концептов нет
      Ответить
      • Ты файка нидлеса? Скажи что-нибудь по нидлесски.
        Ответить
    • чота ржу
      https://youtrack.jetbrains.com/issue/KT-17438
      Ответить
      • Я ещё понимаю, нафига Эппл сделали похожее в Свифте: чтобы иметь костыль на случай, если в обжективсишных фреймворках вдруг найдутся названия переменных, типов или функций, эквивалентные свифтовым ключевым словам.

        Но нафига это Котлину?
        Ответить
        • Чтобы писать в названии текста (сиречь в имени фунгкции) предложение как в BDD в Ruby или в Mocha в JS
          Ответить
          • Но ведь BDD не нужен
            Ответить
            • Ну Mocha вполне себе может тестировать и без BDD.

              На самом деле BDD нужен, просто далеко не всегда, не всем, и очень мало, кто в него действительно умеет. В этом плане он похож на какой-нить скрам или UML
              Ответить
              • Не всегда и не всем это ситуация, когда ты садишь писать тесты чувака, который вообще не шарит в программировании?

                Щас вроде все автоматизаторы могут тесты на паре языков писать. А эффективный менеджер таким заниматься не будет и в принципе.
                Ответить
                • Нет, это когда бизнес-аналитик выкатывает тебе бизнес-требования на 400 страниц, в которых черт ногу сломит.

                  Далее, вам нужно во-первых понять, что понимание требований у вас общее (см "specification by example" и "Bridging the communication gap").
                  Во-вторых вам нужно составить сценарии для тестирования этого говна, иначе как вам убедиться, что всё верно работает?

                  Хорошие требования всегда содержат примеры использования системы.

                  Вы разрабатываете сценарии:

                  * Пользователь входит в систему
                  * Если он из Тимбукту, то его надо поздравить с днем независимости.
                  * Пользователь кладет в корзину ветчину
                  * Если он мусульманин, а ветчина из свиньи, то она автоматически удаляется.
                  * Если он иудей, а ветчина из свиньи, то она автоматически удаляется и отправляется письмо раввину
                  * Если сегодня пасмурно, то стоимость доставки умножается на 1.12.

                  Далее следует логика расчета стоимости товара. Ей посвящены двадцать странц спефикации, а в конце даются примеры расчета коэффициента, на который умножается стоимость самого товара.

                  Пусть "E1" -- страна EC. "E2" -- наличие в ней Евро. "J1" -- признак, что пользователь юрлицо.
                  E1|E2|J1|N|
                  0  0  0  1.1
                  0  1  0  1.4
                  0  1  1  1.5
                  1  0  0  0.71


                  И так, у нас есть куча сценариев и таблиц, по которым можно что-то тестировать.
                  Далее мы берем BDD, и делаем эти сценарии запускаемыми.
                  Причем бекенд может быть написан на разных языках, чтобы проверить, что эти сценарии работают И через веб И с мобильного устройства.

                  То-есть BDD нужно только если:
                  * У вас есть выделенный бизнес-аналитик
                  * У вас действительно очень сложная и запутанная логика, и её много
                  * И, вероятно, несколько клиентов.

                  Реальный пример я видел в компании, которая писала софт для биржи. Там логика высчитывания всех этих опционов и прочей хуйни могла реально занимать кучу страниц
                  Ответить
                  • Да в общем я так и написал: смысл BDD в том, что человек-не-программист может писать спецификации на каком-нибудь кукумбере. Просто я думал, что такой хернёй никто не страдает, но, раз ты видел в дикой природе, то значит я неправ.
                    Ответить

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