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

    +168

    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
    void __fastcall TForm1::ShowBits(unsigned char data)
    {
       if(data&0x1)ImBit0->Canvas->Brush->Color=0x0000FF00;
       else ImBit0->Canvas->Brush->Color=clRed;
       ImBit0->Canvas->FillRect(TRect(0,0,ImBit0->Width,ImBit0->Height));
       if(data&0x2)ImBit1->Canvas->Brush->Color=0x0000FF00;
       else ImBit1->Canvas->Brush->Color=clRed;
       ImBit1->Canvas->FillRect(TRect(0,0,ImBit1->Width,ImBit1->Height));
       if(data&0x4)ImBit2->Canvas->Brush->Color=0x0000FF00;
       else ImBit2->Canvas->Brush->Color=clRed;
    
       ImBit2->Canvas->FillRect(TRect(0,0,ImBit2->Width,ImBit2->Height));
       if(data&0x8)ImBit3->Canvas->Brush->Color=0x0000FF00;
       else ImBit3->Canvas->Brush->Color=clRed;
    
       ImBit3->Canvas->FillRect(TRect(0,0,ImBit3->Width,ImBit3->Height));
       if(data&0x10)ImBit4->Canvas->Brush->Color=0x0000FF00;
       else ImBit4->Canvas->Brush->Color=clRed;
    
       ImBit4->Canvas->FillRect(TRect(0,0,ImBit4->Width,ImBit4->Height));
    
       if(data&0x20)ImBit5->Canvas->Brush->Color=0x0000FF00;
       else ImBit5->Canvas->Brush->Color=clRed;
       ImBit5->Canvas->FillRect(TRect(0,0,ImBit5->Width,ImBit5->Height));
    
       if(data&0x40)ImBit6->Canvas->Brush->Color=0x0000FF00;
       else ImBit6->Canvas->Brush->Color=clRed;
       ImBit6->Canvas->FillRect(TRect(0,0,ImBit6->Width,ImBit6->Height));
    
       if(data&0x80)ImBit7->Canvas->Brush->Color=0x0000FF00;
       else ImBit7->Canvas->Brush->Color=clRed;
       ImBit7->Canvas->FillRect(TRect(0,0,ImBit7->Width,ImBit7->Height));
    }

    Отображение состояния битов байта

    Запостил: absolut, 17 Октября 2011

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

    • void __fastcall TForm1::... - достаточно заметить немногое, чтобы всё остальное стало очевидным
      Ответить
      • да. это уже, так сказать, визитная карточка говнокода.
        Ответить
    • показать все, что скрытоПредложите лучший вариант решения
      Ответить
      • Лучшим будет вариант, где ты съебешь с говнокода или хотя бы перестанешь постить хуйню :)
        Ответить
        • показать все, что скрытоВы не знаете оптимального решения этой задачи?
          upd: Я про задачу говнокод-стартера.
          Ответить
          • 1. спиздить сраный трактор
            2. съебать с говнокодика
            Ответить
            • меня вот посетила идея ... а что если помимо пряток заминусованных комментов, для заплюсованных делать шрифт жирнее и выразительнее? страйкер, ау ... как идейка ? :))
              Ответить
      • void do_shit(ImBitN_type & ImBit, bool color_or_red) {
           if (color_or_red) 
              ImBit->Canvas->Brush->Color=0x0000FF00;   // а это разве не зелёный ёпт?
           else 
              ImBit->Canvas->Brush->Color=clRed;
           ImBit->Canvas->FillRect(TRect(0,0,ImBit->Width,ImBit->Height));
        }
        
        void __fastcall TForm1::ShowBits(unsigned char data)
        {
           ImBitN_type & imbits[8] = { ImBit0, ImBit1, ImBit2, ImBit3, ImBit4, ImBit5, ImBit6, ImBit7 };   // костыль, чтобы работало с этим бредом объявлений членов, вообще надо изначально их объявлять массивом, или (ОБОЖЕ!) создавать динамически
        
           for (unsigned char mask = 0x01, i = 0; mask; mask <<= 1, ++i) 
             do_shit(imbits[i], data & mask);
        }
        Ответить
        • static_assert(CHAR_BIT==8, "8-bit chars required for this monkey-code");
          Ответить
          • да, мне повезло что я никогда не видел sizeof(char) > 1 :)
            Ответить
            • sizeof(char) равно 1 по определению. Даже с 36-битными char-ами.
              Ответить
              • ну тогда я не понял суть претензий к переполнению в сдвиге unsigned char после 8 бита
                Ответить
                • Переполнение произойдёт через CHAR_BIT итераций. А массив imbits длиной только 8. Если CHAR_BIT > 8, то произойдёт выход за пределы массива.

                  Нужно просто не хачить с переполнением, а записать условие цикла как i < 8.
                  Ответить
                  • да, согласен
                    пришлось освежить свои познания, что в "байте" на платформе может быть не 8 бит.
                    и как, доводилось иметь дело с такими платформами?
                    Ответить
                    • и запустится ли с++ билдер из сабжа на таких платформах :)
                      Ответить
                      • не соберется.
                        чтобы собрать быдлер, нужны броландские костыли, а они гвоздями прибиты к интелу
                        Ответить
                    • Думаю, что нет. ;)
                      Ответить
        • Или так:
          void do_shit(ImBitN_type & ImBit, bool isSet) 
          {
             ImBit->Canvas->Brush->Color = isSet ? clLime: clRed;
             ImBit->Canvas->FillRect(TRect(0,0,ImBit->Width,ImBit->Height));
          }
          
          void __fastcall TForm1::ShowBits(unsigned char data)
          {
             ImBitN_type & imbits[] = { ImBit0, ImBit1, ImBit2, ImBit3, ImBit4, ImBit5, ImBit6, ImBit7 }; 
          
             for ( int i=0; i<8; --i) 
               do_shit(imbits[i], (data >> i) & 1);
          }
          Ответить
          • ++i
            Ответить
            • да.
              Ответить
              • интересно, есть ли у билдера аналог GetClientRect
                Ответить
                • да.
                  Ответить
                • а разве билдер не туже vcl использует?
                  Ответить
                  • я не знаток vcl, просто в mfc есть обёртка над winapi-шным GetClientRect, чтобы не делать везде TRect(0, 0, hz.Width, hz.Height) как тут
                    флеймить что круче не собираюсь, и vcl и mfc равно мерзки
                    Ответить
                    • так и я не знаток mfc, так что даже если бы захотели, то пофлеймить бы не получилось.
                      а насчет того что vcl мерзка, вы ведь не знаток...
                      Ответить
        • 0x0000FF00
          ..BBGGRRAA

          A - прозрачность
          Ответить
    • __fastcall - оптимизатор хренов, да регистрами быстрее чем стеком, токо лесенка блин все сожрет.
      Ответить
      • билдер вроде автоматом это ставит, т.к. в делфи по умолчанию аргументы через регистры идут.
        Ответить
    • 1. про TForm1 и прочее уже сказали.
      2. 0x0000FF00 - почему не clLime?
      3. нафига индусятину писать? сразу же просится функция с двумя параметрами
      4. Вместо ImBit# можно завести массив ImBit[]. тогда будет уместен цикл. В качестве альтернативы можно поюзать локально продефайненные макросы - тут это вполне уместно, код будет красивым.
      5. ImBit2->Canvas->Brush->Color = (data & 0x4) ? clRed : clLime;
      может еще что?
      Ответить

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