Кресты / Говнокод #20076 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 Xom94ok, (Updated )

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

  • #define LINE(x) ret.code # x = codes[x]; 
    LINE(0); LINE(1); LINE(2); LINE(3); LINE(4); LINE(5);
    #undef LINE
    Ответить
  • А царский сдвиг не подходит, потому что непортабельно: вдруг порядок битовых полей изменится?
    Ответить
  • Лень смотреть в стандарт и/или проверять. А можно описать массив битовых полей (никогда не задумывался об этом)?
    Ответить
    • Негатив. От них и адрес-то не взять, только, разве что, дробный.
      Ответить
      • > std::vector<bool>
        Я вот до сих пор не понимаю, зачем эти байтоёбы вектор из булов испортили... Есть же отдельный битсет...
        Ответить
        • > Есть же отдельный битсет...

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

    Так что въеби Х-макро и не парься.
    Ответить
  • Цикл не нужен

    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];
        }
    Ответить
      • 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);
    }
    Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8