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

    +4

    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
    #define key \
        keySequence.keys[i]
    
    #define read_helper(val_)                 \
      file.read(                              \
          reinterpret_cast<char*>(&key.val_), \
          sizeof(decltype(key.val_))          \
      )
    
    for (DWORD i = 0; i < keyPointer.Count; i++)
      read_helper(RotationQuaternion);
    
    for (DWORD i = 0; i < keyPointer.Count; i++)
      read_helper(TimeValue);
    
    for (DWORD i = 0; i < keyPointer.Count; i++)
      read_helper(PositionValue),
      key.SwapBytes();
    
    #undef read_helper
    #undef key

    Запостил: LispGovno, 31 Мая 2016

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

    • Как же бесят говноеды с макросами
      Ответить
      • кстати да, нахуй макро если можно сделать шаблон

        п.с. подаешь на вход макроса референс на большой объект и жрешь то самое...
        Ответить
      • не знаю. по сравнению с чтением объектов/структур из файла как двоичных блобов - макросы это цветочки.
        Ответить
    • #define dREAD(value_, type_ )                                 \
          file.read(                                                \
              reinterpret_cast<char*>(&keySequence.keys[i].value_), \
              sizeof(type_)                                         \
          )
      
      for (DWORD i = 0; i < keyPointer.Count; i++)
        dREAD(RotationQuaternion, VECTOR4);
      
      for (DWORD i = 0; i < keyPointer.Count; i++)
        dREAD(TimeValue, float);
      
      for (DWORD i = 0; i < keyPointer.Count; i++)
        dREAD(PositionValue, VECTOR3),
        keySequence.keys[i].SwapBytes();
      
      #undef dREAD
      Ответить
      • > dREAD
        Да, и правда страшно.
        Ответить
        • Яб макросовое быдло сажал за экстремизм, расжигание на религиозной почве и критику крещенских купаний
          Ответить
          • си просто такой ЯП, что на нем без макросов тяжко

            Кстати говоря даже в жабке мне иногда жаль что макросов нет
            Ответить
            • > в жабке
              #define PSF public static final
              ?
              Ответить
              • в идее есть live templates)

                ну например хочу такое
                #ifdef DEBUG
                doVeryHeavyCheck();
                #endif
                Ответить
                • if (debugMode) {
                      doVeryHeavyCheck();
                  }
                  И надеяться, что JIT увидит, что debugMode это константа и выпилит проверку.
                  Ответить
                  • и как я debugMode конпелятору передам?
                    Ответить
                    • Сделаешь 2 версии класса с настройками - дебажную и релизную. Скажешь компилятору собирать нужную, в зависимости от профиля.

                      Ну либо вообще в конфиг вынесешь, и не будешь ебать мозг с двумя сборками... JIT вроде обращение к static final оптимизирует даже если они из конфига были прочитаны.
                      Ответить
                      • > оптимизирует даже если они из конфига были прочитаны
                        Сишкобляди опять соснули со своими дефайнами.
                        Ответить
                        • ну нет, там джит выпилит (а может и не выпилит) а препроцессор вообще уберет даже из.obj файла

                          и размер будет меньше
                          Ответить
                      • ну и куда я положу две версии класса? ты правда желаешь мне чтоб я имел два одинаковых файла MySuperTool.java отличающихся одной строчкой?

                        Я не могу вынести в конфиг, я не знаю как мой класс будет использоваться)

                        Правильный ответ -- завяжись на System.getProperties или env vars или JNDI (если ёбнутый ентерпрайзник времен JavaEE 6). Но всё это говено.

                        Проше было бы делать make debug и make release, правда?

                        вот в C# есть preprocessor (вообще в c# есть всё, как в Одессе) и никто не страдает
                        Ответить
                        • В шарпе реально есть препроцессор? О_о
                          Ответить
                          • да)
                            https://msdn.microsoft.com/en-us/library/ed8yd1ha.aspx

                            А еще там есть атрибут [Conditional("DEBUG")] чтобы добавлять метод только при дебаге

                            Как всегда в шарпике есть 150 способов сделать одно и тоже, в зависимости от твоего бекграунда (ну как там были ~ и finalize итд)
                            Ответить
                          • Нет, но CLR делает вид, что есть

                            Даже не так - препроцессора нет, а директивы препроцессора есть
                            Ответить
                            • CLRу рази не срать на препроцессор?
                              разве он не перед компиляцией работает?
                              Ответить
                        • Unlike C and C++ directives, you cannot use these directives to create macros.

                          Короче только ифы и дефайн совсем кастрированный
                          Ответить
                          • ну слава богу нельзя сделать макрос и ухуячить туда половину бизнесс-логики

                            это как с генериками: генерики вроде есть, но до крестовых шаблонов им далеко
                            Ответить
                            • Ну и вместо няшного LOG("%d", 42) предлагается засрать весь код ифдефами? Ну либо забить и не вырезать в релизе, в конце-концов не байтоёбский язык...
                              Ответить
                              • LOG("%d", 42) как раз не так страшно, как например ассертнуть что что-то валидно, если валидность это вычисляется пару секунд

                                Очевидно что в тестовой версии я это хочу, а в продакшене -- нет

                                зы: в жабе естати есть assert, который как-бы включается через -ea.

                                но есть проблема: Долбоёбы написали assert doSomethingUseful(), и теперь нельзя запускаться без -ea, потому что useful не сделается
                                Ответить
                              • хахахах

                                "всё такое вкусное, что же выбрать?"
                                http://stackoverflow.com/questions/3788605/if-debug-vs-conditionaldebug
                                Ответить
                            • Генрики отстой

                              не налабаешь:
                              template<class T>
                              void read_helper(istream& file, T& val)
                              {
                                file.read(reinterpret_cast<char*>(&val), sizeof(T));
                              }
                              Ответить
                              • Зато у них есть медленная но рефлексия.
                                Ответить
                                • и аоп, и динамическая типизация, linq, xaml, и много всего вообще
                                  Ответить
                                • зато ими не ударишь код об землю
                                  Ответить
                              • хе-хе

                                скучный какой си с решоточкой
                                никакой магии
                                Ответить
                              • Нужен static_assert(is_pod_v<T>, "Copying bitpattern of non-POD types invokes UB");
                                Ответить
                              • remove_reference забыл
                                Ответить
                                • поясни remove_reference
                                  Ответить
                                  • remove_reference<>::type вернет T для T, T& и T&&
                                    Ответить
                                    • Нахрен он тут поясни
                                      Ответить
                                      • sizeof(T&) не обязан быть равен sizeof(T)
                                        Ответить
                                        • > sizeof(T&) не обязан быть равен sizeof(T)

                                          А где в коде sizeof(T&) ? Компилятор сопоставит с образцом, отпилит референс и в T положит реальный тип. Референсов на референс не бывает (бывает референс на указатель), поэтому тут всё ок.
                                          Ответить
                                        • Роман прав. Более того, sizeof(T&) = sizeof(T) при any T
                                          Ответить
                      • А что, в жабу условную коконпеляцию не завезли?
                        Ответить
                    • if (log.isDebugEnabled()){
                      ...
                      }

                      https://www.google.com/search?q=if+(log.isDebugEnabled(
                      Ответить
        • Судья dREAD
          Ответить
    • template<class T>
      void read_helper(istream& file, T& val)
      {
        file.read(reinterpret_cast<char*>(&val), sizeof(T));
      }
      
      for (DWORD i = 0; i < keyPointer.Count; i++)
      {
        read_helper(file, keySequence.keys[i].RotationQuaternion);
      }
      for (DWORD i = 0; i < keyPointer.Count; i++)
      {
        read_helper(file, keySequence.keys[i].TimeValue);
      }
      for (DWORD i = 0; i < keyPointer.Count; i++)
      {
        read_helper(file, keySequence.keys[i].PositionValue);
        keySequence.keys[i].SwapBytes();
      }
      Ответить
      • Немного не до конца портанул:
        auto& key = keySequence.keys[i];
        З.Ы. А, тьфу, оно же в каждом цикле своё, не вынесешь ;(
        Ответить
    • > SwapBytes()
      А нахер этой структуре SwapBytes? Как бы сериализатор должен свапать байты, а не сама структура...
      Ответить
      • Это не сериализатор, автор файлы из игры расковыривает.
        Ответить
        • Это с гейдева. Где ещё пишут говнокод с умным видом, заявляя что автор не говнокодер и так было нужно, а я просто ниасилятор и нихрена не понял. Бомбит аж
          Ответить
          • гейдева - лесбиянка что ли?
            Ответить
          • Ну изначальный автор там связист-ракетчик и кулхацкер, никак не программист. Зато ни про кого из тут присутствующих в майкрософте не слышали, а ему персонально xbox забанили за порт игры на пк.
            Вот тот кто макросы предложил да, не в себе. Я подозреваю что он пьян.
            Ответить
        • > Это не сериализатор
          > расковыривает
          Ок, десериализатор.
          Ответить
    • Вот тут ещё вкуснятина
      for (DWORD i = 0; i < keyPointer.Count; i++)
        read_helper(PositionValue),
        key.SwapBytes();
      Обратите внимание на запятую в конце второй строки. Я сначала подумал, что тут питоноошибка, но нет, мы просто не любим фигурные скобки!
      Ответить
      • read_helper(PositionValue)

        Определитесь уже - вы змея или верблюд?
        Ответить
        • В питоне, кстати, принято именовать типы БольшимБуквами, а значения_маленькими. Т_у_т, кОнечно, ПолноеМесиво().
          Ответить
          • Нахуй так жить?
            Ответить
          • В питоне нет типов, только классы.
            Ответить
            • а класс не тип?
              Ответить
            • Хуево наверное вам, без целых чисел, строк и плавающего питуха
              Ответить
          • в питоне куча исключений к сожалению
            как тебе класс list?
            Ответить
            • Ну это какая-то искусственная хуйня - делить на типы и классы, хотя по сути это одно и то же.
              Ответить
              • Сам же написал, что в Питоне нет типов, только классы: http://govnokod.ru/20108#comment330471

                Значит, ты на типы и классы зачем-то делишь, т. е. занимаешься искусственной хуйнёй.
                Ответить
                • > Питоне нет типов, только классы
                  Вообще говоря, как и следовало ожидать, это утверждение неверно.
                  Python 2.7.11+ (default, Apr 17 2016, 14:00:29)
                  
                  >>> type
                  <type 'type'>
                  >>> type(type)
                  <type 'type'>
                  
                  >>> type(list)
                  <type 'type'>
                  >>> type([])
                  <type 'list'>
                  
                  >>> class B(): pass
                  ... 
                  >>> type(B)
                  <type 'classobj'>
                  >>> type(B())
                  <type 'instance'>
                  
                  >>> class C(object): pass
                  ... 
                  >>> type(C)
                  <type 'type'>
                  >>> type(C())
                  <class '__main__.C'>
                  Вот видите, какой простой и консистентный язык?

                  Я в своём утверждении имел в виду типы, определяемые пользователем, т.е. классы.
                  Ответить
                  • А я думаю что классы суть типы. Структура разве не тип? А класс разве не структура с указателем на методы?

                    На самом деле нужно мыслить в терминах abstract data types.и не выебываться
                    Ответить
                    • Это всё - вопросы терминологии. С моей точки зрения, если говорить о терминологии, понятие "класса" в его общепринятом виде вообще нинужно.

                      Если говорить конкретно о Python, то там своя атмосфера и свои определения "типа" и "класса", которые исторически сложились и имеют мало общего со здравым смыслом.
                      Ответить
                      • Вирт тоже так говорит:)

                        А какое определение у класса в пайтоне кстати?
                        Чем int не класс если можно сделать так
                        >>> class MyInt(int):pass
                        ...
                        >>> dir(MyInt())
                        ['__abs__', '__add__', '__and__', '__bool__', '__cei
                        at__', '__floor__', '__floordiv__', '__format__', '_
                        t__', '__invert__', '__le__', '__lshift__', '__lt__'
                        _', '__radd__', '__rand__', '__rdivmod__', '__reduce
                        ', '__round__', '__rpow__', '__rrshift__', '__rshift
                        _subclasshook__', '__truediv__', '__trunc__', '__xor
                        s']
                        >>> MyInt().bit_length()
                        0
                        >>> MyInt(1).bit_length()
                        1
                        >>>
                        Ответить
                      • Классы - непересекающиеся подмножества в теории множеств.
                        Типы - логические выражения вида T, T -> T', T x T' из теории типов.

                        Т.е. они вообще друг на друга похожи примерно никак.

                        Например, у функции на Питоне:

                        def foo(bar): return baz

                        тип typeof(bar)->typeof(baz) но это можно отнести к разным классам - смотря как поделить и какое множество. Например, если множество: все функции, то этот класс описывает функции с одним аргументом.
                        Ответить
                        • >>Классы - непересекающиеся подмножества в теории множеств.
                          А еще классы это такие комнаты, в которых сидят школьники.

                          Что общего между комнатами и подмножествами?
                          Ни те ни другие не имеют никакого отношения к классам в ООП.

                          Как и следовало ожидать, wvxvw увеличил количество ненужных букв в Интернете.
                          Ответить
                          • Слово «класс» в программировании вообще не нужно. Это калька со служебного слова “class” языка C++, в котором оно использовалось для описания типа объекта. С лёгкой руки Страуструпа и при обсуждении программ на других языках программирования стали вместо терминов «тип объекта» и «инстанс/экземпляр объекта» употреблять слова «класс» и «объект».
                            Ответить
                            • A declaration giving rise to a class of objects might well have been called an "object class" (in analogy with Hoare's record class). In choosing the shorter term "class" we felt that we had a good terminology which distinguished clearly between the declared quantity (the class) and its dynamic offspring (the objects). Our good intentions have not quite worked out, however. Many users tend to use the term "class", or perhaps "class instance", to denote an object, no doubt because "object" does not occur as a reserved word of the language. (As an afterthought, anno 1978, we might have insisted that all class declarations must be prefixed, and defined a primitive outermost prefix "object" containing detach and resume as local procedures. See also (Wang and Dahl 1971)).

                              ACM SIGPLAN Notices, Vol. 13, No.8 in August 1978
                              Ответить
                              • int number;

                                По аналогии мы можем сказать, что int — это class of integers, а number — это offspring/object/instance. Но мы не называем int классом только потому, что в языке с ним не связано ключевое слово “class”.
                                Ответить
                                • Там еще запутаннее. В 60х, да и в 70х когда говорили о типах, то не подразумевали типы из теории типов, и типами называли все, что угодно, в том числе и то, что мы сегодня называем классами в ОО языках. Но после того как Карри-Ховард соответствие получило распространение, типы из логики стали стандартой интерпретацией. Классы, по понятным причинам не могут отобразить все, что этим тезисом подразумевается, так они и остались восновном для ОО использования. С другой стороны, в популярных ОО языках типы не особенно развивались / были очень примитивными. Единственным способом их явного создания стало объявление класса.

                                  В современных языках снова понятие типа расширяется всяким вне-логическими свойствами, типа "владение" в Расте, но это по прежнему называют типом.
                                  Ответить
                            • > С лёгкой руки Страуструпа

                              Да ладно, он тупо с симулы скопипастил.
                              Ответить
                              • Да, но Симулы нет ни в Гитхабе, ни на Говнокоде, значит, она не нужна.

                                Взглянул на синтаксис Симулы: begin...end, как в Паскале, но при этом тип перед переменной, как в Си. Да это же Алгол с классами!
                                Ответить
                                • Алан Кей все сказал о классах в си-петух-петух

                                  "Я придумал термин «объектно-ориентированный», и вот что я вам скажу, я не имел ввиду С++."
                                  Ответить
                          • Чего тебе так пригорает? Пойди книжку почитай, кино посмотри, зачем ты мне о своих психических расстройствах рассказываешь. Я помогать все равно не буду.
                            Ответить
    • > #undef read_helper
      > #undef key
      Насрал и прикрыл газеткой.
      Ответить

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