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

    +6

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    for(int i = 0; i < codes.size(); ++i) {
        switch(i) {
            case 0: ret.code0 = codes[i]; break;
            case 1: ret.code1 = codes[i]; break;
            case 2: ret.code2 = codes[i]; break;
            case 3: ret.code3 = codes[i]; break;
            case 4: ret.code4 = codes[i]; break;
            case 5: ret.code5 = codes[i]; break;
        }
    }

    А всё потому, что ret.code[0-5] - битовые поля. Эх.

    Запостил: Xom94ok, 25 Мая 2016

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

    • #define LINE(x) ret.code # x = codes[x]; 
      LINE(0); LINE(1); LINE(2); LINE(3); LINE(4); LINE(5);
      #undef LINE
      Ответить
      • Въебал плюс за отборное говнецо.

        З.Ы. Я бы не пропустил на ревью ;)
        Ответить
        • Потому что точки с запятой дублируются? :-(
          Ответить
          • Потому что break проебал, как минимум.

            Про # вместо ## промолчу, сам часто путаю, т.к. очень редко пользуюсь.
            Ответить
            • Стоп! Тут же говнопаттерн: свитч в цикле.
              Ответить
              • Ой, да. Цикл то я и не заметил.
                Ответить
                • У меня всё-таки остаётся надежда, что codes.size() не всегда равно шести и в некоторых случаях нужно выполнять меньше строк. Иначе это полное говно.
                  Ответить
                  • > не всегда равно шести
                    Афёрматив. Иначе цикл-свитч не нужны.
                    Ну или много писанины.
                    Ответить
                    • > Афёрматив
                      > Негатив
                      Зэ бомб хэз бин плантэд.
                      Ответить
                      • Террористс вин.
                        Ответить
                        • Фаер ин зе хол!
                          Ответить
                          • Ну что вы творите! Из-за вас опять подсяду на CS:GO!
                            Ответить
                            • смещение GO по адресу в регистре CS?
                              Ответить
                              • ога, по этому адресу обитает путь: /home/koncord/.steam/steam/steamapps/common/Counter-Strike Global Offensive/csgo.sh
                                Ответить
                                • Ого, в Линь таки завезли игорей?
                                  Ответить
                                  • каких игорей? Он конкорд

                                    а если ты про игры, то майнсвиппер еще в aptitude был
                                    https://www.debian.org/doc/manuals/aptitude/ch02s06.en.html
                                    Ответить
                                  • Завезли, они тут же утонули, остался pitux races и 500 крестиков-ноликов.
                                    Ответить
                    • Цикл в любом случае ну нужен:

                      switch(std::min(codes.size(), 6)) {
                          case 6: ret.code5 = codes[5];  /*FALLTHROUGH*/
                          case 5: ret.code4 = codes[4];  /*FALLTHROUGH*/
                          case 4: ret.code3 = codes[3];  /*FALLTHROUGH*/
                          case 3: ret.code2 = codes[2];  /*FALLTHROUGH*/
                          case 2: ret.code1 = codes[1];  /*FALLTHROUGH*/
                          case 1: ret.code0 = codes[0]; 
                      }
                      Ответить
              • паттерн "сосни префетчер"
                Ответить
              • Я думал это называется "парсер"
                Ответить
            • Блин, с ## налажал :(
              Ответить
    • А царский сдвиг не подходит, потому что непортабельно: вдруг порядок битовых полей изменится?
      Ответить
    • Лень смотреть в стандарт и/или проверять. А можно описать массив битовых полей (никогда не задумывался об этом)?
      Ответить
      • работает, значит можно
        Ответить
      • Негатив. От них и адрес-то не взять, только, разве что, дробный.
        Ответить
        • > дробный
          А я смогу поменять часть бита, пользуясь дробным адресом?
          Ответить
        • и получилося в ответе
          полтора байта и две трети
          Ответить
          • > получилося
            Кто тебя так научил говорить - "полчилося"?! "Получилось", ёпта, ты же на говнокодике сидишь, кресты не позорь свои!

            PS, капча - вин: http://i.prntscr.com/2fd09417b8f942c28946f72709ee5ffa.png
            Ответить
      • На SO советуют std::bitset, std::vector<bool> и boost::dynamic_bitset.
        Ответить
        • > std::vector<bool>
          Я вот до сих пор не понимаю, зачем эти байтоёбы вектор из булов испортили... Есть же отдельный битсет...
          Ответить
          • > Есть же отдельный битсет...

            Ну у битсета в compile-time размер указывается, не совсем подходит. По уму надо было отдельный dynamic_bitset запилить, но ведь так велик соблазн вкрутить куда-нибудь специализацию шаблонов, чтобы было потом, что в книжках писать...
            Ответить
    • >Almost everything about fields is implementation-specific.
      K&R

      Так что въеби Х-макро и не парься.
      Ответить
    • std::bitset - не попацански?
      Ответить
      • >sexually-transmitted disease
        ненене
        Ответить
      • https://ideone.com/XoTbY3
        то бишь немного теряется смысл, хотя может быть этот "смысл" там нахрен и не нужен, но это уже другая история
        Ответить
        • Может и не теряется. Зависит от структуры же.
          Ответить
          • ну, я про это и говорю, но нужны ли тогда вообще битовые поля? имхо нет
            Ответить
    • Цикл не нужен

      int i = codes.size()
      
          switch(i) {
              case 0: break;
              case 6: ret.code5 = codes[--i];
              case 5: ret.code4 = codes[--i];
              case 4: ret.code3 = codes[--i];
              case 3: ret.code2 = codes[--i];
              case 2: ret.code1 = codes[--i];
              case 1: ret.code0 = codes[--i];
          }
      Ответить
      • case 0 лучше в конец подвинуть, имхо.
        Ответить
      • - int i = codes.size()
        + size_t i = std::min(6, codes.size());
        Ответить
        • 1. Fall-through ворнинг как отключать будете на трёх компиляторах?
          2. Qt контейнеры возвращают int для размера.
          3. Проверка размера? Ты меня сейчас три дня назад таким неявным образом тупым обозвал? Я её, как очевидную, выкинул для ясности кода. И там не просто молчаливый срез куска контейнера, а ассерт + лог, чтобы сообщить об ошибке.
          Ответить
          • >> Fall-through ворнинг
            Не нужен

            >> как отключать будете на трёх компиляторах?
            -w
            Ответить
          • > 1. Fall-through ворнинг как отключать будете на трёх компиляторах?
            Через аннотацию «[[fallthrough]];». Чай, не двадцатый век, пора уже «C++17» использовать.

            > 2. Qt контейнеры возвращают int для размера.
            Зачем они нужны?
            Ответить
            • Зачем вы ебёте себе мозги этой хуетой? В "PHP" нет ни компиляторов, ни контейнеров, ни аннотаций, и при этом весь веб течёт от наслаждения, как последние сучки, воздерживавшиеся год.
              Ответить
      • Анроллнул аки царь!
        Ответить
    • Автор почти до Duff's device дотянул :-)

      register n = (count + 7) / 8; /* count > 0 assumed */

      switch (count % 8)
      {
      case 0: do { *to = *from++;
      case 7: *to = *from++;
      case 6: *to = *from++;
      case 5: *to = *from++;
      case 4: *to = *from++;
      case 3: *to = *from++;
      case 2: *to = *from++;
      case 1: *to = *from++;
      } while (--n > 0);
      }
      Ответить

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