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

    +11

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    int a[4]={}; 
    void f(void){} 
    void functionWithArrayParam(int (&a)[4])
    {
            a[3]=4;
    } 
    void functionWithFunctionParam(void (*f)(void))
    {
            f();
    }; 
    int (&functionReturnArray(void))[4]
    {
            return a;
    } 
    void (*arrayOfFunction[4])(void)={f,f,f,f}; 
    void (*functionReturnFunction(void))(void)
    {
            return f;
    }; 
    int main() {
            functionReturnArray()[3]=4;
            functionWithArrayParam(a);
            arrayOfFunction[3]();
            functionWithFunctionParam(f);
            functionReturnFunction()();

    Батхертный путь C++
    Просветление — состояние полной осознанности (выход за пределы дуального ума)... Это скачкообразное изменение восприятия окружающего мира, знаменующее собой переход к отличной от общепринятой форме мышления. Одновременно является началом открытия чакры «третьего глаза» и трамплином для глубоких изменений сознания. Как витальная форма, тяжело поддается ментальному описанию.
    Батхертный путь C++ - путь, которым идут просветленные последователи Дао и Дзен С++, способные писать всё в одном выражении.

    Доступность этого пути в C++ усиливает возможности C++ по созданию одного и того же кода самыми разнообразными и очень красивыми способами.

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

    Этот принцип батхертного пути C++, лежащий в основе C++, помогает потратить дополнительные 1000% времени на разработку и поддержку C++ программ и получить за это дополнительные деньги. Поэтому C++ крайне выгоден!

    Взглянем на малую часть основ этого пути при объявлении массивов и функций в C++:
    Док-ва истинности пути к просветлению:
    http://ideone.com/FCW4f

    Итак, используя эти простые принципы нужно написать массив функций, возвращающих массив функций с параметром функция, принимающая массив функций, возвращающих функцию void (void)? typedef запрещён.

    Останется только один! Истинный просветленный носитель разума и света!

    Если вы знаете другие основы батхертного пути C++, то искренне прошу поделиться с нами вашими открытыми чакрами.

    Запостил: LispGovno, 06 Ноября 2012

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

    • Развил тему из соседнего треда:
      http://govnokod.ru/12064
      Ответить
    • > написать массив функций
      Нельзя вот так вот взять и написать массив функций. Можно только массив указателей на функции.
      Ответить
      • Сори. Это не я. Я лишь разместил объяву. Элсо дельное замечание.
        Ответить
        • Итак, используя эти простые принципы напишем массив указателей на функции, возвращающих массив указателей на функции с параметром указатель на функцию, принимающую массив указателей на функции, возвращающих указатель на функцию void (void)?

          1) Указатель на функцию void (void):
          void (*f)();
          2) массив указателей на функции, возвращающих указатель на функцию void (void) в доме который построил Джек:
          void (*(*[])())();
          3) Указатель на функцию, принимающую массив указателей на функции, возвращающих указатель на функцию void (void):
          void (*)(void (*(*[])())());
          4) Массив указателей на функции с параметром указатель на функцию, принимающую массив указателей на функции, возвращающих указатель на функцию void (void)
          void (*[]) (void (*)(void (*(*[])())()));[/code] 5) массив указателей на функции, возвращающих массив указателей на функции с параметром указатель на функцию, принимающую массив указателей на функции, возвращающих указатель на функцию void (void):
          void (*(*[])()[]) (void (*)(void (*(*[])())()));
          Си - это просто ;)

          P.S. Надеюсь нигде не ошибся.
          Ответить
          • С форматированием накосячил, сорри ;(
            Ответить
          • Задание вроде было на крестах, а я не вижу ссылок. Неужели передавал и возвращал указатель на массив? Не путь крестоджедая.
            Ответить
            • Хех, ну как-то так... а теперь задача со звездочкой. Проинициализируй эту переменную при помощи кресто11блядских лямбд в одну строку.
              Ответить
            • Я косячник: "‘f’ declared as function returning an array". Действительно ссылки или указатели забыл. Минусуем мой пост.
              Ответить
            • http://ideone.com/EtjbLN
              Как-то так, но я уже ни в чем не уверен.
              Ответить
              • >я уже ни в чем не уверен.
                void (*(&(*OMG[])())[]) (void (*)(void (*(*[])())()));

                Я не понимаю что в этой всей теме написано, так что проверить тебя не могу. Ждем умных людей. Сорри.
                Ответить
                • > Я не понимаю что в этой всей теме написано, так что проверить тебя не могу.

                  Взялся за гуж, не говори, что не дюж.
                  Ответить
                  • Так тут нечего проверять, вот дешифратор:
                    http://cdecl.ridiculousfish.com
                    Ответить
                    • Дешифратором я и сам проверял, вот он и схавал возврат массива не по ссылке... А я даже не задумался об этом.

                      P.S. Если честно - в практике никогда не возникало даже желания вернуть сишный массив. Указатель на массив в куче, вектор какой-нибудь это часто. А массив ни разу.
                      Ответить
                      • И мне сишный массив по ссылке ни разу не понадобилось возвращать. За все время крестописания. Так что тоже не вижу в этом какого-либо смысла, тк нет контроля за временем жизни такого массива. Вот если однажды кресты научатся собирать мусор из &, то да. А пока это бесполезно. Темболее что у такого массива фиксированная длина. Ждем ещё более опытных товарищей.
                        Ответить
                      • а разве можно?)
                        Ответить
                        • >>Ждем ещё более опытных товарищей.
                          >а разве можно?)
                          Дождались. А у меня между прочим вся надежда была на вас. :-[
                          Ответить
                          • В говнокоде темы код:
                            int a[4]={};
                            int (&functionReturnArray(void))[4]
                            {
                                    return a;
                            }
                            Ответить
                            • ну что ж, согласен - можно, но ссылку

                              единственный случай, когда это хоть как то может пригодиться - внутри в объекте хранится массив статической длины (типа my::array<int, 100>) и мы его пытаемся вернуть по ссылке, чтобы порадовать крестоблпринципиальную систему вывода типов

                              интересно, можно ли в таком классе определить оператор приведения к int[100] & ?
                              Ответить
                              • >можно ли в таком классе определить оператор приведения к int[100] &

                                Думаю и к T[N]& (где T и N - шаблоны).
                                Ответить
                                • я это и имею в виду
                                  интересен синтаксис этого извращения

                                  > auto
                                  нет, скорее передача в
                                  template <class T, size_t N>
                                  void foo(T (&arg)[N]) { ... some code working with array[N]... }
                                  Ответить
                                  • Кстати, auto скопирует массив переданный по ссылке или примет его как ссылку? auto вроде всегда копирует, насколько я знаю.
                                    Ответить
                                    • Я предположу, допусим авто скопирует массив переданный по ссылке. Но это будет страннно. При передаче структуры в качестве параметра в шаблонную функцию - она копируется, а при передачи массива - копируется только указатель на массив. Так вот при авто такое поведение не повторяется. что структура, что массив - скопируются.
                                      Ответить
                                    • все гораздо проще
                                      auto без ссылки компилятором выведется как T * вместо T[N]
                                      по очевидной причине - массивы нельзя присваивать, это не структуры
                                      Ответить
                              • >единственный случай, когда это хоть как то может пригодиться - внутри в объекте хранится массив статической длины

                                Это очевидно, но я с трудом могу представить себе, когда это реально нужно.

                                > чтобы порадовать крестоблпринципиальную систему вывода типов

                                auto? Вроде проблем быть не должно?
                                Ответить
                          • >Батхертный путь C++
                            Кстати, похоже ОП пытался сделать отсылку к какой-то книге:
                            Читал я вроде какую-то книгу "Бархатный путь C++" или что-то подобное.
                            Ответить
                        • По ссылке то да. Но зачем?
                          Ответить
                          • Да. С точки зрения архитектуры никаких технических проблем для возврата таких ссылок на массивы быть не может для языка. Сссылка - тот же указатель, так что даже на х86 влезет в eax без каких-либо проблем. Поэтому это в крестах и реализовали. Темболее что указатель на массив няшная сишка и раньше умела возвращать. Так что крестостандартизаторы просто сохранили старое поведение и для ссылок.
                            Ответить
        • Разве это не ты создал эту тему?
          http://www.gamedev.ru/flame/forum/?id=156269
          Ответить
          • Я не копипастер. Конечно я. Ты лучше покажи где твой говнокод на крестошаблонах? Я не нашел.
            Ответить
            • Вафлейме
              в разделе програмиррование
              совсем искать разучился
              Ответить
    • Извините конечно, но "Где здесь C++"?

      Указатели на функции - это Си :)
      Ответить
    • С++ хороший и годный язык, если уметь на нём писать. Просто не используйте говношаблоны, говноссылки, говноисключения и говнообъекты.
      Ответить
      • C++ хороший и годный язык, если на нём не писать. Пофиксил.
        Ответить
    • - Я понял! - заявил парень. - Это из-за истерики, которую я вчера закатил Вам?
      Ответить

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