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

    +13

    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
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    #include <iostream>
    using namespace std;
    
    // -- robot`s internal closed implementation --
    int  data1[] = { 0, 1, 2 }; char data2[] = { 42 };
    
    // -- robot`s API 
    const int *GetMechaData1() { return data1; }
    size_t GetMechaData1Size() { return 3; }
    const char *GetMechaData2(){ return data2; }
    size_t GetMechaData2Size() { return 1; }
    
    // -- pentagon`s internal closed implementation --
    //--------------------если T равно U, то результат будет D, а иначе - G------------//
    template<class T, class U, class D, class G> struct SelectIF     { typedef G type; };
    template<class T, class D, class G>  struct SelectIF<T, T, D, G> { typedef D type; };
    
    // -- pentagon`s API 
    enum { eMAXBUFER = 200 * sizeof(int) };
    template<class T, size_t N>void AcceptData(const T(&src)[N])
    {
        typedef typename SelectIF<T, char, int, T>::type Cast;
        enum { is_char = std::is_same<T,char>::value };
    
        cout << "received data:\n";
        const size_t num = (N<eMAXBUFER) ? N : eMAXBUFER;
    
        if (is_char)
            for (size_t n = 0; n < num; ++n)
                cout << "char code = " << (Cast)src[n] << " : char = '" << src[n] << "'\n";
        else
            for (size_t n = 0; n<num; ++n)
                cout << "item = " << src[n] << endl;
    }
    
    // client code
    template<class T, size_t N> struct Adapter
    {
        typedef Adapter<T, N + 1> Next;
        void Pass(const T* data, const size_t num)
        {
            if (N < num)
            {
                Next().Pass(data, num);
                return;
            }
    
            T(&arr)[N] = reinterpret_cast<  T(&)[N] > (mBuf);
            for (size_t n = 0; n< N; ++n) arr[n] = data[n];
            AcceptData(arr);
        }
    
        size_t mLen;
        T mBuf[eMAXBUFER];
    };
    
    template<class T> struct Adapter<T, eMAXBUFER>
    {
        void Pass(const T* data, const size_t)
        {
            for (size_t n = 0; n< eMAXBUFER; ++n)  mBuf[n] = data[n];
            AcceptData(mBuf);
        }
    
        size_t mLen;
        T mBuf[eMAXBUFER];
    };
    
    
    Adapter<int,  1> adapter1;
    Adapter<char, 1> adapter2;
    
    int main()
    {
        {
            const auto data = GetMechaData1();
            const auto num = GetMechaData1Size();
            adapter1.Pass(data, num);
        }
        {
            const auto data = GetMechaData2();
            const auto num = GetMechaData2Size();
            adapter2.Pass(data, num);
        }
    }

    Крестушки раскрестушились, а подраться не решились.
    Под катом ещё несколько вариантов.

    Запостил: LispGovno, 19 Января 2014

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

    • http://rextester.com/CJWAH96992
      Ответить
    • показать все, что скрытоАльтернативный вариант:
      #include <iostream>
      #include <functional>
      #include <vector>
      #include <assert.h>
      using namespace std;
      
      // -- internal closed implementation --
      int data1[] = {0, 1, 2};
      char data2[] = {'*'};
      
      const int *GetMechaData1() { return data1; }
      size_t GetMechaData1Size() { return 3; }
      const char *GetMechaData2() { return data2; }
      size_t GetMechaData2Size() { return 1; }
      
      // -- API for Big Human-like Robot 
      
      const int *GetMechaData1();
      size_t GetMechaData1Size();
      const char *GetMechaData2();
      size_t GetMechaData2Size();
      
      // pentagon code with strict license hereby disallow for change function ViewArray
      
      template<class T, size_t N> void ViewArray(const T (&arr)[N])
      {
          for( auto& item: arr )
              cout<< "item : "<<item<<endl;
      }
      
      // client code
      template<class T, size_t max_limit> class ViewArrayAdapter
      {
        typedef function<void(const T* const, const size_t)> adaptee_t;
        typedef vector<adaptee_t> funcs_t;
        template<size_t > class T1{};
        template<size_t i>
        static void fill(T1<i>, funcs_t& r)
        {
          r[i]=[](const T* const a, const size_t size)
            {
              assert(size==i);
              auto a1 = (const T(*)[i])(const T*)a;
              ViewArray(*a1);
            };
          fill(T1<i-1>(), r);
        }
        static void fill(T1<0>, funcs_t& r){}
        static funcs_t adapted()
        {
          static const funcs_t r = []()
          {
            funcs_t r;
            r.resize(max_limit+1);
            fill(T1<max_limit>(), r);
            return r;
          }();
          return r;
        }
        public:
        void operator()(const T* const ptr, const size_t size) const
        {
          assert(size<=max_limit);
          assert(size>0);
          adapted()[size](ptr, size);
        }
      };
      
      constexpr size_t bank_size_limit=850;
      int main()
      {
        cout<<":"<<endl;
        ViewArrayAdapter<int, bank_size_limit>()(GetMechaData1(), GetMechaData1Size());
        ViewArrayAdapter<char, bank_size_limit>()(GetMechaData2(), GetMechaData2Size());
        cout<<"ok"<<endl;
        return 0;
      }
      Ответить
      • http://ideone.com/oaNsuT
        Реквестирую спойлер.
        Ответить
        • показать все, что скрытоМой любимый вариант:
          #include <iostream> 
          using namespace std; 
          // -- internal closed implementation -- 
          int data1[] = {0, 1, 2}; 
          char data2[] = {42};
          
          const int *GetMechaData1() { return data1; } 
          size_t GetMechaData1Size() { return 3; } 
          const char *GetMechaData2() { return data2; } 
          size_t GetMechaData2Size() { return 1; }
          
          // -- API
          
          const int *GetMechaData1(); 
          size_t GetMechaData1Size(); 
          const char *GetMechaData2(); 
          size_t GetMechaData2Size();
          
          // client code
          
          template<class T, size_t N> void ViewArray(const T (&arr)[N]) 
          { 
              for( auto& item: arr ) 
                  cout<< "item : "<<item<<endl; 
          }
          
          
          template<class type> void doit(const int size, const type*data) 
          { 
          //#define xxx(N)  case N:ViewArray<type,N>(reinterpret_cast<  type (&)[ N ]  >(data));break; 
          #define xxx(N)  case N: {auto a1 = (const type(*)[N])(const type*)data;ViewArray(*a1);break;}
          
          
          switch(size){ 
          xxx(1);xxx(2);xxx(3);xxx(4);xxx(5);xxx(6);xxx(7);xxx(8);xxx(9);xxx(10);xxx(11);xxx(12);xxx(13);xxx(14);xxx(15);xxx(16); 
          xxx(17);xxx(18);xxx(19);xxx(20);xxx(21);xxx(22);xxx(23);xxx(24);xxx(25);xxx(26);xxx(27);xxx(28);xxx(29);xxx(30);xxx(31);xxx(32); 
          xxx(33);xxx(34);xxx(35);xxx(36);xxx(37);xxx(38);xxx(39);xxx(40);xxx(41);xxx(42);xxx(43);xxx(44);xxx(45);xxx(46);xxx(47);xxx(48); 
          ///...не влезло в сообщение :) 
          xxx(993);xxx(994);xxx(995);xxx(996);xxx(997);xxx(998);xxx(999);xxx(1000);xxx(1001);xxx(1002);xxx(1003);xxx(1004);xxx(1005);xxx(1006);xxx(1007);xxx(1008); 
          xxx(1009);xxx(1010);xxx(1011);xxx(1012);xxx(1013);xxx(1014);xxx(1015);xxx(1016);xxx(1017);xxx(1018);xxx(1019);xxx(1020);xxx(1021);xxx(1022);xxx(1023);xxx(1024);
          
          } 
          #undef xxx 
          }
          
          
          int main() 
          { 
            cout<<"start"<<endl; 
            // вот здесь нужно обратиться к функционалу ViewArray 
            doit<int>(GetMechaData1Size(),GetMechaData1()); 
            doit<char>(GetMechaData2Size(),GetMechaData2()); 
            cout<<"end"<<endl; 
            return 0; 
          }
          Ответить
          • http://ideone.com/SFavsx
            И суда спойлерок докиньте плис.
            Ответить
            • Ну маленькое под спойлер не стоило прятать. Спасибо. Ну а я хреново формулирую задачи. Не быть мне дирехтаром. :(
              Ответить
              • показать все, что скрыто
                #include <iostream>
                using namespace std;
                
                // -- internal closed implementation --
                int data1[] = {0, 1, 2};
                char data2[] = {42};
                
                const int *GetMechaData1() { return data1; }
                size_t GetMechaData1Size() { return 3; }
                const char *GetMechaData2() { return data2; }
                size_t GetMechaData2Size() { return 1; }
                
                // -- API
                
                const int *GetMechaData1();
                size_t GetMechaData1Size();
                const char *GetMechaData2();
                size_t GetMechaData2Size();
                
                // client code
                
                template<class T, size_t N> void ViewArray(const T (&arr)[N])
                {
                    for( auto& item: arr )
                        cout<< "item : "<<item<<endl;
                }
                
                
                template<class type> void doit(const int size, const type*data)
                {
                //#define xxx(N)	 case N:ViewArray<type,N>(reinterpret_cast<  type (&)[ N ]  >(data));break;
                #define xxx(N)	 case N: {auto a1 = (const type(*)[N])(const type*)data;ViewArray(*a1);break;}
                
                #define level0(N) xxx(N);xxx(N+1);
                #define level1(N) level0(N);level0(N+2);
                #define level2(N) level1(N);level1(N+4);
                #define level3(N) level2(N);level2(N+8);
                #define level4(N) level3(N);level3(N+16);
                #define level5(N) level4(N);level4(N+32);
                #define level6(N) level5(N);level5(N+64);
                #define level7(N) level6(N);level6(N+128);
                #define level8(N) level7(N);level7(N+256);
                #define level9(N) level8(N);level8(N+512);
                
                
                switch(size){
                level9(1)
                
                }
                #undef xxx
                }
                
                
                int main()
                {
                	cout<<"start"<<endl;
                  doit<int>(GetMechaData1Size(),GetMechaData1());
                  doit<char>(GetMechaData2Size(),GetMechaData2());
                	cout<<"end"<<endl;
                  return 0;
                }

                http://ideone.com/PwPQVt
                Похоже парень исправился.
                Ответить
                • И на код выше спойлер.


                  Оправдание этого человека, что написал этот код умиляет:
                  Я не отрицаю что написал говнокод, но ведь боевые роботы стоят, китайцы на подходе к пентагону. Я не мог смотреть как никто не может их спасти и ложится спать с мыслью что утром китайцы уже все захватят.
                  Ответить
                  • И комментарий на всю эту вакханалию, обращённый к её авторам:
                    laMer007
                    Kartonagnick
                    kipar
                    Да вы все тут упоротые!
                    Ответить
                    • а, дак это коллективное творчество гейдевок
                      ну тогда хотя бы ссылки можно было приложить, а то в принципе до сих пор нихуя не понятно что происходит
                      Ответить
                      • Крестоблядь троллит крестоблядь:
                        - Скажи крестобля-а-адь, а ты на чём пишешь, на Дельфях?
                        - Нет - отвечает Крестоблядь - я пишу на креста-а-а-ах! Хахахахах а ты ахахахаха наверное ахахахахах пишешь на сишапре?
                        - Нет, отвечает ей первая крестоблядь, я пишу на крестах хахахаха
                        Ответить
                        • это была суть треда, а вот сам тред:
                          http://www.gamedev.ru/flame/forum/?id=184999
                          Ответить
                          • Блин, нахуй так жить? :)

                            Писать на крестах как на сишке из-за мифической возможности портануть на сишку...
                            Ответить
                            • Ему сразу так и сказали, что он какую-то хуйню задумал.
                              Ответить
                            • >> Писать на крестах как на сишке из-за мифической возможности портануть на сишку...

                              Что, и такие есть? Я думал они вымерли.
                              Вообще как-то глупо, ведь до сих пор пытаются тянуть эту"обратную совместимость"
                              Ответить
                              • Ну иногда не глупо, если ты пишешь небольшую сишную либу, которая окажется полезной и в сишке и в крестах и даже в объективном си.

                                Но это будет именно сишная либа, к крестам она не имеет никакого отношения. Разве что совместимость с крестами еще больше ограничит, и запретит юзать некоторые возможности сишки.
                                Ответить
                                • Так сишную либу можно хоть к чему прицепить. Если юзать ее сугубо как либу. Или я не о том?
                                  Ответить
                                  • > Так сишную либу можно хоть к чему прицепить. Если юзать ее сугубо как либу.
                                    Можно :) Просто некоторым извращенцам хочется ее компилировать крестокомпилятором, а не просто скомпилить сишкой и прилинковать. А *.h в любом случае должен быть c++-aware, иначе ее будет неудобно цеплять.
                                    Ответить
                                    • оффтоп - борманд, глянь сайтец , там можно найти англичанина, который желать овладевать русский (не репетирор, а просто студент)
                                      http://www.italki.com/
                                      Ответить
                                      • Борманд, читал твой пост про трактор и изучение английского (сейчас не найду). Вообще вот если бы я описывал свою проблему, то у меня точно такая же. Вот прямо слово в слово. Могу даже твой весь пост повторить, просто описав свои ощущения и состояние.

                                        Даже приходится погромче фильмы делать и желательно в наушниках. Всякие шумы или параллельные разговоры в фильмах мешают дико. А ещё хочется помедленнее дикторским голосом. В общем не суть. Тоже не умею в тихий английский. Интересно как от этого избавится?

                                        Я вот думаю песни на английском начать учить и петь в караоке барах или на застольях. Главное девушкам нравится и всегда буду душой компании. Так разговорный подтяну может (русский c девочками :D ). Ещё вот думаю к мормонам сходить. Видил, они у нас чистые англичане. Можно поговорить с носителем языка.
                                        Ответить
                                        • > Интересно как от этого избавится?
                                          Видимо только больше слушать.

                                          > Я вот думаю песни на английском начать учить и петь
                                          http://www.youtube.com/watch?v=oHg5SJYRHA0
                                          Ответить
                                      • Надо будет конечно твой сайт глянуть. Что там? Общение на инглише по скайпу? Я вот присмотрел чатрулетку. пока не пользовался. прямо в браузере с рандомным петухом общаешься
                                        Ответить
                                        • Если что в посте выше ответ Сандору Клигану на пост http://www.italki.com/
                                          Ответить
                                          • Кстати, сейчас гуглопереводчик произносит английские слова лучше любого моего знакомого. Так что можно брать за эталон. Да и русский тоже весьма круто читает. Даже я буду заикаться на его фоне.
                                            Ответить
                                            • > Да и русский тоже весьма круто читает.
                                              Хм, и правда. Ещё пару месяцев назад было как-то упорото, а сейчас открыл и удивился.
                                              Голос изменился, читает лучше. Но пока с интонацией проблемы. Хотя, ещё пару лет, и допилят.
                                              Ответить
                                              • По английски по моему вообще идеально читает. Я так не отличу от носителя языка.
                                                Ответить
                                                • > Я так не отличу от носителя языка.
                                                  Один раз я разговорился с "носителем языка". Он начал говорить, что вот у этих такой акцент, у этих вот такой. Я же сказал ему, что для меня акцента всего два - тот, который я понимаю, и тот, который нет.
                                                  Ответить
                                  • Можно предоставлять сишный интерфейс, а реализацию писать на крестах со всеми вытекающими плюшками. Это полезно отчасти потому, что в плюсы по сути очень сложно сделать нормальный FFI. А в сишку FFI довольно простой и понятный, а главное, уже сделан для дохреллиона языков.
                                    Пример - libclang.
                                    Ответить
                      • > китайцы на подходе к пентагону
                        Сразу видно, что на сайте собрались потриоты. Небось скоро заправят трактор, раз первая же мысль о защите родного пентагона. Нет вот чтобы родину так защищать!
                        Ответить
                      • > до сих пор нихуя не понятно что происходит
                        Не знаю что там происходит, но начало где-то здесь
                        http://www.gamedev.ru/flame/forum/?id=184999&page=14#m195
                        и до конца страницы (и на следующей вроде сам код). Там был какой-то призыв для защиты человечества от больших человека подобных роботов и защиты пентагона.

                        // -- API for Big Human-like Robot 
                        // pentagon code with strict license hereby disallow for change function ViewArray
                        Ответить
                        • ты написал функцию, которая падает на некорректных данных и не работает на корректных, лол

                          P.S. Лень читать тред, старый я стал. Да и на ГК, имхо, крестосрачи повеселее.
                          Ответить
                          • Мне лень искать суть задачи, но присказка какая-то такая:


                            Ну я подумал это само собой разумеющееся, что на сервер мусор не отправляют. Вы же понимаете, что AcceptData пентагона отправит кроме содержимого самого банка памяти ещё и размер этого банка и контрольную сумму. По неизвестной причине пентагон очень удивится, что к ним пришел дамп банка памяти размером много превышающий все известные им спроектированные узлы банков памяти для всех известных им моделей больших человекоподобных роботов. К Вам лично сам пентагон обратился поправить этот баг.

                            Вы наверняка попросили пентагон поменять функцию AcceptData, но в ответ пентагон сказал, что у нас критическая ситуация. Через три дня роботу выполнять миссию, которую не возможно отложить, как докладывают военные аналитики Любые отсрочки приведут к большим потерям денежных средств и\или человеческих ресурсов (вам очевидно, что пентагон имел ввиду жизни). Для успешного выполнения этой миссии необходим функционал, для работы которого должен быть реализован модуль, отправляющий данные из банков памяти в пентагон.
                            AcceptData содержит пару сотен строк кода, но реализация установлена законодательно (тупые бюрократы). Чтобы поменять эту функцию необходимо: разрешить изменить эту функцию на всех уровнях бюрократии, изменить эту функцию, переписать все тесты и провести их, переписать и проверить все стандарты и спецификации, где упоминается эта функция, провести испытания. Военные инженеры предполагают, что пока удастся все это сделать - пройдет около четырех дней. Это не допустимо. Теперь вы единственный человек, кто может спасти эту миссию.
                            Ответить
                        • "Если мне нужно работать с указателем - я работаю с указателем. И пишу максимально простой код. Мне для этого не нужно использовать систему изнасилования типов".

                          P.S. К концу треда они таки изобретут итераторы?
                          Ответить
                          • > К концу треда они таки изобретут итераторы?
                            Вообще ни разу не упомянули.)))00
                            Ответить
                            • Но мысль то зреет. Колесо уже есть - велосипед на подходе
                              Ответить
                              • А я итераторами не пользуюсь, лол.
                                Просто в ++03 индексами удобнее
                                Ответить
                            • Нихуя, так был сахарный for по итератору даже.
                              Ответить
                        • template<class T, size_t N> void Foo(const T (&arr)[N])
                          А вот это, кхм, API надо прям повешать на стену и подписать "никогда не пиши так, не приноси будущее в жертву ради сиюминутной выгоды".

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

                          P.S. Кстати, а что будет, если натравить эту хрень на VLA? :)
                          Ответить
                          • > а что будет, если натравить эту хрень на VLA?
                            Не скомпилируется, имхо. Да и в стандарте крестов вла нет.
                            Ответить
                            • Не скомпилилось: variable-sized array type <...> is not a valid template argument
                              Ответить
    • Алсо я выложил это на ютуб:
      http://www.youtube.com/watch?v=NAn1t39eG9A
      Ответить
      • > это
        Блин, я думал ты выложил туда код про ОБЧР и пентагон ;)
        Ответить
      • Это игра!!! Настоящая!!!
        Ответить
    • так вот как маструбация у настоящих программистов выглядит...
      Ответить

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