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

    +2

    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
    26. 26
    27. 27
    28. 28
    auto addition = [] (double a, double b) { return a + b; };
    
    auto substruction = [] (double a, double b) { return a - b; };
    
    auto divide = [] (double a, double b) { return a / b; };
    
    auto multiplie = [] (double a, double b) { return a * b; };
    
    typedef std::function<double (double, double)> DoubleFunc;
    
    int main()
    {
        std::vector<DoubleFunc> funcVector;
    
        funcVector.push_back(addition);
        funcVector.push_back(substruction);
        funcVector.push_back(multiplie);
        funcVector.push_back(divide);
    
        std::for_each(funcVector.begin(), funcVector.end(), []
        (DoubleFunc func)
        {
            std::cout << func(3.14159, 100500) << std::endl;
        });
    
        system("pause");
        return 0;
    }

    А ваш язык такое сможет:)? (я о delphi, java, etc.)
    Кстати, если писать все в таком духе, то параллелиться прога будет безболезненно:), правда это уже какой-то хацкель/лисп...

    Запостил: suc-daniil, 30 Июля 2012

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

    • http://ideone.com/wRr2j
      Выкинуть кучу сообщений об ошибки компиляции? Вполне может!
      Ответить
    • Школьник штоле?
      http://ideone.com/tHfxh
      Где тут безболезненное распараллеливание?
      Ответить
      • показать все, что скрытоТам же где и в хацкеле, но это только при условии что вся прога так написана будет:)
        И я имел ввиду, чтобы чисто функциональные объекты были, лежали в непрерывном куске памяти и т.д.
        Ответить
        • так и запишем: функциональные объекты лежат в непрерывном куске памяти, а сраное императивное говно в дискретном
          Ответить
          • В непрерывном куске памяти бесконечно большого объема.
            fix
            Ответить
      • В AsParallel()
        Ответить
    • Пффффф.

      funcs :: [Float -> Float -> Float]
      funcs = [(+), (-), (*), (/)]
      
      main = mapM_ (print . \f -> f pi 100500.0) funcs]
      Ответить
    • >(я о delphi, java, etc.)
      Огласите весь список пожалуйста.
      Ответить
      • показать все, что скрытоЭто я в основном на тему холиваров аля C++VS..., так что долго преречислять
        Ответить
        • Аналогичные махинации возможны в любом современном языке (да даже в сишке и _вроде_ в паскале можно [Тарас поправит, если что]). Так что непонятно, что вы хотели показать кодом в топике.
          Ответить
          • показать все, что скрытоВ сишке - нельзя, там с функциями - только по указателю, а указатель на стек не положишь, а про поцкаль я и говорить не хочу
            А сказать я хотел то, что на плюсах можно функциональщину писать:)
            Ответить
            • http://ideone.com/wiIET
              Не уверен, ты толстый тролль или...
              Ответить
              • Кстати, даже на сишке кода меньше чем на крестах...
                Ответить
                • а уж про java я вообще молчу
                  Ответить
                • да получится даже меньше, если для вектора написать initialization list, а цикл фор как for (x : myvec)
                  просто топикстартер открывает для себя новые неизведанные глубины, после паскаля то
                  Ответить
                  • показать все, что скрытоinitialization list - лень, for (x : myvec) - только в vs11, так что троль - это ты:)
                    http://wiki.apache.org/stdcxx/C++0xCompilerSupport, почитай, вдруг буквы знакомые увидишь:)
                    Ответить
                    • >initialization list - лень, for (x : myvec) - только в vs11, так что троль - это ты:)
                      Лолшто?
                      http://liveworkspace.org/code/ef43df1a2d1b8f8a792e6e603a732217
                      http://liveworkspace.org/code/f548e982533180d47bef22dd9290c233
                      Ответить
                      • #include <iostream>
                        
                        using namespace std;
                        
                        double (*funcs[])(double, double) = 
                        {
                           [](double x, double y) { return x + y; },
                           [](double x, double y) { return x - y; },
                           [](double x, double y) { return x * y; },
                           [](double x, double y) { return x / y; }
                        };
                        
                        int main() {
                           for(auto f : funcs)
                              cout<<f(3.141592, 100500.0)<<endl;
                           return 0;
                        }
                        Ответить
                        • http://liveworkspace.org/code/86ed33afd786417e0110a454a5ff8621
                          Ответить
                          • #include <iostream>
                            using namespace std;
                            
                            #define LAMBDA(op) [](double x, double y){ return x op y;}
                            
                            double (*funcs[])(double, double) = {
                               LAMBDA(+), LAMBDA(-), LAMBDA(*), LAMBDA(/)   
                            };
                            
                            int main() {
                               for(auto f : funcs)
                                  cout<<f(3.141592, 100500.0)<<endl;
                               return 0;
                            }

                            Годно.
                            Ответить
                      • из визуалок - только в 11 есть range based for, а я её недавно снёс, а то, что он есть в GCC 4.7 и без тебя знаю:)(Там по-моему почти полностью весь новый стандарт реализован)
                        Ответить
              • >результат: ошибка выполнения время: 0.01s память: 1720 kB сигнал: -1
                Ответить
                • return забыл ;) А компилится видимо с -std=c89, в котором результат main'а с забытым return не определен..
                  Ответить
                  • да, поторопился (обычно пишу return), у меня локально скомпилилось и завершилось без проблем (с99 по дефолту).
                    Ответить
                    • показать все, что скрытоя этот код писал так, чтобы он нормально работал под VS2010, а она консоль, если без паузы сразу закрывает, а инфу аля "ошибка выполнения время: 0.01s память: 1720 kB сигнал: -1" выдаёт в основном окне
                      Ответить
            • > а указатель на стек не положишь
              А посоны и не знали...
              Ответить
            • > а про поцкаль я и говорить не хочу

              ты лол
              Ответить
        • >...так что долго преречислять
          " .удиви меня .заинтригуй меня . "(c)
          Ответить
    • >system("pause");
      Говнокодер.
      Ответить
      • показать все, что скрытоа что вы предлагаете? (без издевки)
        Ответить
        • Дать программе завершиться
          Ответить
        • Нахуй вообще просить пользователя "нажать кнопку для завершения"? Без этого никак?
          Ответить
          • показать все, что скрытоДа, никак, без этого ты не увидишь результата (я про конкретно про студию), прога просто завершится
            Ответить
            • открой для себя контрол+ф5
              Ответить
              • Авотхрен, не фурычит, кроме шуток, тут либо пауза, либо getchar, либо что-то ещё в этом роде
                Ответить
                • у всех работает, а у тебя не работает
                  Ответить
                  • http://social.msdn.microsoft.com/forums/en-US/Vsexpressvc/thread/1555ce45-8313-4669-a31e-b95b5d28c787/?prof=required

                    system("pause") is probably the best way.
                    Визуалстудиофаги такие няшки!

                    Зато там есть правильный ответ:
                    With the new visual studio 2010 you might see this behavior even when you use ctrl f5 aka "start without debugging". This is most likely because you created an "empty project" instead of a "Win32 console application".

                    In the older versions it would default to the console subsystem even if you selected "empty project", but not in 2010, so you have to set it manually. To do this select the project in the solution explorer on the right or left (probably is already selected so you don't have to worry about this). Then select "project" from the menu bar drop down menus, then select "*project_name* properties" > "configuration properties" > "linker" > "system" and set the first property, the drop down "subsystem" property to "console (/SUBSYSTEM:CONSOLE)". The console window should now stay open after execution as usual.
                    Ответить
                    • занятно
                      накопал же
                      Ответить
                      • Блин. Сейчас попытался описать проблему другу, который пользуется Visual Studio 2010, думал вместе посмеемся над пишущими system("pause")...

                        Так оказалось, что после перехода на 2010 он сам так пишет, т.к. влом крутить настройки проекта...

                        Куда катится мир...
                        Ответить
                        • > другу
                          > Visual Studio 2010
                          > system("pause")
                          Бывшему другу
                          fxd
                          Ответить
                        • зачем люди создают empty project, когда можно создать empty console project
                          Ответить
                          • А он есть? (года 3 не запускал визуалку, не помню уже).
                            Ответить
                            • ну да
                              создаешь консольный проект, ставишь тыцку "не надо мне никакого говна, хочу голый проект" и профит
                              Ответить
                    • Не знаю, кого как, но меня никогда не напрягало открыть (лишнюю) консоль. Кушать она не просит, выводит исправно. Ну и да, если средства отладки поддерживают - тем более.
                      Ответить
                      • > открыть консоль
                        Да вы что, не пугайте человека такими страшными словами! Он поди и не знает, зачем нужна эта самая консоль...
                        Ответить
                        • Консоль? Командная строка штоле? Говорите правильно!
                          Ответить
                          • Хотел отправить под новым аккаунтом, т.к. старый забанил модератор, но получил ошибку компиляции комментария:
                            Пожалуйста, подождите неделю, прежде чем Вам будет доступно комментирование., поэтому пишу под этим.

                            Командная строка Windows.
                            fxd
                            Ответить
                            • Я же написал тебе в ЛС - свежевыданный модераторский аккаунт активируется через неделю.
                              Ответить
                              • >Хотел отправить под новым аккаунтом, т.к. старый забанил модератор
                                >свежевыданный модераторский аккаунт
                                O_O
                                Ответить
                                • Ну что не понятно?
                                  Вот борманд подаёт заявку на становление модератором: http://govnokod.ru/11493#comment148700
                                  Несмотря на предыдущие (http://govnokod.ru/11461#comment148157) нарушения правил ему всё же выдают модерский аккаунт.
                                  Вот борманда снова банят, уже совсем недавно: http://govnokod.ru/11490#comment148911
                                  Он уж хотел было писать комменты под модером, с блекджеком, а тут, зараза, оказалось, что неделю ждать ещё...
                                  Ответить
                      • Только в vs через неё отлаживать как-то хреново...(особенно dx)
                        Ответить
                        • Софт с DirectX в эксклюзивном режиме отлаживать хреново и без нее ;) А в неэксклюзивном какие проблемы?
                          Ответить
            • Результаты тестирования пациента:
              1) Знание английского - нет
              2) Знание с++и STL - нет
              3) Знание С - нет
              4) Знание основных команд студии - нет
              5) Опыт троллинга - нет
              Ответить
          • Это вендопроблемы: заставлять юзера тыкать 100500 раз кнопку "далее" и не давать отойти ни на шаг. Даже с гентой на кофеварке будет проще: поставил компиляться и ушел спать
            Ответить
      • За это можно было и плюсануть.
        Ответить
    • funcs = [(+), (-), (*), (/)]
      main = print $ map (\f -> f pi 100500.0) funcs
      Ответить
    • Ждем от тебя новых говнокодов, братюнь.
      Ответить
    • Посоны, кто знает, как в Хаскеле сделать вот так:
      f = id _ pi 100500.0
      _ - теперь свободный параметр по обозначаниями Nemerle, а pi 100500.0 - забинденные.
      Теперь можно делать так:
      f (*)
      что эквивалентно
      (id (*)) pi 100500.0
      что эквивалентно
      (*) pi 100500.0
      что эквивалентно
      pi*100500.0
      ?
      То есть смысл, чтобы f была объявлена без своего параметра. Лямбду через \ не предлагать, так как параметр там будет.
      Ответить
      • Для бинарных ф-ций можно вот так:
        (`f` 2)
        ==
        f _ 2

        А для остальных нужны лямбды:
        \x y -> f x 1 y
        ==
        f  _ 1 _


        А без лямбд никак.
        Ответить
        • >А без лямбд никак.
          Ну может какими-нибудь хаками выразить через $ . id или flip ?
          Ответить
        • Это мне было нужно было только для:
          bindSnd snd' f = (`f` snd')
          funcs = [(+), (-), (*), (/)]
          main = print $ map ((bindSnd 100500.0) ((bindSnd pi).id)) funcs

          Победа не чистая, так как пришлось написать свою функцию bindSnd, но код работает. Очевидно пока проще написать через лямбду \.
          PS Я не против варианта через какие-нибудь стрелочки и прочих хаков, но пока все говно.
          Ответить
          • Кстати, кто скажет, почему если написать ((bindSnd 100500.0).((bindSnd pi).id)) - не компилируется? (Я там красную точку поставил).
            Ответить
            • > не компилируется
              Потому что точка красная.

              А если серьезно - сейчас изучим.
              Ответить
            • http://ideone.com/T5X6R

              А вот для трех аргументов:
              http://ideone.com/N7Bt3
              Ответить
              • funcs = [(+), (-), (*), (/)]
                arg = flip ($)
                 
                -- аргументы применяются справа налево (первым будет pi, вторым 100500.0)
                main = print $ map (arg 100500.0 . arg pi) funcs

                Спасибо. Сразу видно, четкий пацан. Я проиграл в специальной олимпиаде. :(
                Ответить
                • Победа не главное, главное - участие.
                  Ответить
                  • Га Га. Я наркоман. Белая горячка? Может я сошёл с ума? Какието закорючки пишу. :D
                    funcs = [(+), (-), (*), (/)]
                    main = print $ map (flip ($ pi) 100500.0) funcs
                    Ответить
    • Java
      http://ideone.com/7s0bH
      JS
      http://ideone.com/oBQTN
      %%ОЛЛОЛО ошибка компиляции, ваще охуеть.%%
      Ответить
    • funcs = [(+), (-), (*), (/)]
      main = print $ zipWith (uncurry.id) funcs $ repeat (pi, 100500.0)

      Без лямбд.
      Ответить
    • да, может, даже досовский турбопас, и без лямбд
      короче школьник рассказывает о преимуществах ололо сиплюсплюса на примере того, что в паскале 20 тоже лет назад было
      поставил плюс чтобы не утонуло, срач доставил
      Ответить
    • >А ваш язык такое сможет:)? (я о delphi, java, etc.)
      В шарпе даже этого писать не надо. Там есть LINQ.

      >то параллелиться прога будет безболезненно:)
      AssParallel, aга!!!
      Ответить
    • http://ideone.com/nnQAw

      Автор толстый тролль.
      Ответить
      • Препод его тролль походу
        Ответить
      • показать все, что скрытото, что ты привёл - это указатель на функцию(точнее паскалевский аналог оного), а разницу между указателем и объектом я думаю тебе объяснять не нужно:)
        Ответить
        • Разница между std::function и указателем на функцию в том, что std::function может содержать любую хрень со скобками (функции, объекты с оператором(), замыкания и т.п.).

          В вашем примере эта возможность никак не используется, и вполне достаточно указателя на функцию ;) Учитесь составлять более подходящие примеры, если хотите затроллить оппоннента...
          Ответить
          • А попутно, там можно обойтись без лямбд, да и вообще без плюсов;) Спасибо за адекватный пост:)
            Ответить
            • > А попутно, там можно обойтись без лямбд, да и вообще без плюсов
              И без программирования...

              Задачка вполне решается третьеклассником в столбик.
              Ответить
            • http://www.gamedev.ru/users/?id=49036
              Ответить
        • Ты серьезно думаешь, что в твоем векторе содержится исполняемый код, который ты даже описал в другом месте?

          #include <iostream>
           
          class A
          {
            public:
              double add(double a, double b)
              {
                return a + b;
              }
          };
           
          int main()
          {
            A* object = NULL;
            std::cout << (*object).add(3.14, 100500);
            
            return 0;
          }


          тогда что случится в результате выполнения этого кода?
          Ответить
          • Он упадёт:) NULL нельзя разыменовывать:)
            А вектор содержит экземпляры функторов, то есть объекты.
            Ответить
            • иди учить ассемблер, покормил, ведь нельзя же быть таким упорутым.
              Ответить
              • Положил бы уж NULL в ссылку для полноты ощущений
                Ответить
              • Блин, как я мог забыть, add компилятором разворачивается во что-то типа A_add. Я был бы прав, если бы capture list не был пуст:(
                Кстати, почему оно округляется, если там double?
                Ответить
                • Я тебя не совсем понял, но как ты не можешь понять, что в компилируемых языках код не может просто так взять и дописаться в память? Он должен предварительно скомпилированным быть. И даже если есть у тебя бинарное представление уже скомпилированного кода то смысла нет размещать его в другой кусок памяти, так как одного экземпляра достаточно.

                  Даже у методов объектов всего по одному экземпляру исполняемого кода имеется (и это абсолютно никак не зависит от количества созданных объектов во время выполнения), просто параметров там на самом деле передается чуть больше чем ты пишешь в скобочках (скорей всего просто передается еще дополнительно указатель на объект в памяти не особо разбираюсь в том как код компилируется, но я делал бы именно так)

                  Попробуй еще задаться вопросом: почему в С++ нет функции eval?

                  Надеюсь достаточно по хардкору объяснил почему нет принципиальной разницы в твоем коде на с++ и в моем на паскале, если учитывать конечно самую суть вопроса и процесса выполнения программы и не затрагивать тонкости компиляторов и всего другого.

                  И надеюсь ты понимаешь, что зря решил повыебываться этим твоим говно++
                  Ответить
                  • Боюсь, он воспринимает подобные радиосигналы как белый шум и не более ='( жОпыта нет
                    Ответить
    • Перл (никто не упомянул) само собой разумеется. Но такое я даже на шелле могу сделать - и даже без башизмов.
      Ответить
    • Я последнее время стал принимать Нетолстин и вам советую.
      Ответить
      • Над вашими шутками перестали смеяться?
        Вас называют толстым троллем?

        Приобретите Нетолстин™, и вы снова почувствуете уверенность в себе, а ваш троллинг будет тонким и шелковистым.
        Ответить
        • Я недавно попробовал Антитроллин, но оно мне как-то не пошло. От него я стал увядать. Я даже начал думать, что это яд.
          Ответить
          • попробуй тогда Амитриптилин, название похоже, а толку больше
            Ответить
          • >попробовал Антитроллин, но оно мне как-то не пошло
            Так тебе он и не нужен. Он тут никому не нужен.
            Неудивительно, что эффекта не заметно.
            Ответить
            • >Он тут никому не нужен.
              Троллей что-ле нет? Или всем вредно, ибо тролли?
              Ответить
      • Кстати уже 3 года употребляю, зависимости никакой.
        Ответить
    • Облизав губы и смешно причмокивая, это чудо выдало:
      Ответить

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