1. Си / Говнокод #28466

    0

    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
    // https://github.com/flipperdevices/flipperzero-firmware/blob/2a6a3a1bf7ba1ecb42b8cbfc1b1856a54f2878b7/applications/plugins/music_player/music_player.c#L74
    
    static bool is_white_note(uint8_t semitone, uint8_t id) {
        switch(semitone) {
        case 0:
            if(id == 0) return true;
            break;
        case 2:
            if(id == 1) return true;
            break;
        case 4:
            if(id == 2) return true;
            break;
        case 5:
            if(id == 3) return true;
            break;
        case 7:
            if(id == 4) return true;
            break;
        case 9:
            if(id == 5) return true;
            break;
        case 11:
            if(id == 6) return true;
            break;
        default:
            break;
        }
    
        return false;
    }
    
    static bool is_black_note(uint8_t semitone, uint8_t id) {
        switch(semitone) {
        case 1:
            if(id == 0) return true;
            break;
        case 3:
            if(id == 1) return true;
            break;
        case 6:
            if(id == 3) return true;
            break;
        case 8:
            if(id == 4) return true;
            break;
        case 10:
            if(id == 5) return true;
            break;
        default:
            break;
        }
    
        return false;
    }

    Хуйня какая-то. То ли дело "паттерн матчинг".

    Запостил: j123123, 01 Декабря 2022

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

    • Есть кстати такая вот компилтайм-говнолиба для крестов, где есть паттерн-матчинг https://github.com/mpark/patterns

      #include <cstdio>
      
      #include <mpark/patterns.hpp>
      
      void fizzbuzz() {
        using namespace mpark::patterns;
        for (int i = 1; i <= 100; ++i) {
          match(i % 3, i % 5)(
              pattern(0, 0) = [] { std::printf("fizzbuzz\n"); },
              pattern(0, _) = [] { std::printf("fizz\n"); },
              pattern(_, 0) = [] { std::printf("buzz\n"); },
              pattern(_, _) = [i] { std::printf("%d\n", i); });
        }
      }
      
      int main() {
        fizzbuzz();
      }


      И сколько же хуйни на шаблоноговне надо написать, чтобы это реализовать?
      https://github.com/mpark/patterns/blob/master/include/mpark/patterns/match.hpp можно тут посмотреть
      Ответить
    • Мне неясна постановка задачи. Зачем у функций два аргумента?
      Ответить
      • Чтобы сбить с толку сканер. Вроде обфускации.
        Ответить
      • Походу чтобы от любой ноты гамму строить, в semitone хранится первая ступень гаммы, а в id смещение n-ной ступени.

        Хотя хз конечно, можно было просто номером ноты обойтись.
        Ответить
        • Лажа выходит. Работает только для до-мажора. На остальных гаммах будут сплошные false.
          Ответить
          • Хм, не проверял, я думал это для этого запилили.

            Тогда бред какой-то
            Ответить
            • Судя по предыдущей функции (semitone_to_note), semitone — абсолютное значение, 0 означает «до», т. е. это белая клавиша вне зависимости от второго аргумента.

              Второй же аргумент нужен исключительно ради такого цикла:
              for(size_t i = 0; i < 7; i++) {
                      if(is_white_note(music_player->model->semitone, i)) {


              Да, 6 холостых прогонов из 7 ради получения i, которое из semitone можно было бы получить напрямую простенькой функцией (похожей на semitone_to_note).

              Как называется такой говнопаттерн программирования?
              Ответить
              • Похоже, что тут всё работает. Автор рисует рояльную клавиатуру, и ему нужно определить, какие клавиши нажаты. Но вот интерфейсы он для этого придумал чудные.
                Ответить
    • Хуня конечно, надо таблицу истинниости набубенить

      Правда, компилятор это и так сделает
      Ответить
    • static bool is_white_note(uint8_t semitone, uint8_t id) {
          static int8_t id_to_semitone[7] = {0, 2, 4, 5, 7, 9, 11};
          return id_to_semitone[id] == semitone;
      }

      INB4 нет защиты от неправильного id.
      Ответить
      • компилятор свитч в такую хуйню и превратит небось?
        Ответить
        • Не совсем: https://gcc.godbolt.org/z/azE71eTdv

          На таблицу переходов для свича мозгов хватает, чтобы убрать сравнения внутри меток — нет.
          Ответить
      • Пофиксил, проверь:
        static uint8_t table[65536] = {
            [0] = 1,
            [513] = 1,
            [1026] = 1,
            [1283] = 1,
            [1796] = 1,
            [2309] = 1,
            [2822] = 1,
        };
        
        uint8_t is_white_note(uint8_t semitone, uint8_t id)
        {
            return table[semitone * 256 + id];
        }

        https://gcc.godbolt.org/z/dMaY5hf1G
        Ответить
        • помоему у тебя получился малость разреженный моссив

          как его правильно хронить не проебывая место? Была же такая структура
          Ответить
          • Исправил, проверь:
            #include <stdint.h>
            #include <stdio.h>
            
            typedef struct {
                uint16_t key;
                uint8_t filled;
            } Bucket;
            
            #define SIZE 14
            
            static Bucket table[SIZE] = {};
            
            uint8_t hash(uint16_t key)
            {
                return key % SIZE;
            }
            
            uint8_t next_hash(uint8_t cur_hash)
            {
                return (cur_hash + 1) % SIZE;
            }
            
            void set(uint16_t key)
            {
                uint8_t key_hash = hash(key);
                Bucket *bucket = &table[key_hash];
                
                while (bucket->filled && bucket->key != key) {
                    key_hash = next_hash(key_hash);
                    bucket = &table[key_hash];
                }
                
                bucket->filled = 1;
                bucket->key = key;
            }
            
            uint8_t get(uint16_t key)
            {
                uint8_t key_hash = hash(key);
                uint8_t init_key_hash = key_hash;
                
                Bucket *bucket = &table[key_hash];
                while (bucket->filled && bucket->key != key) {
                    key_hash = next_hash(key_hash);
                    if (key_hash == init_key_hash) {
                        return 0;
                    }
                    bucket = &table[key_hash];
                }
                return bucket->filled && bucket->key == key;
            }
            
            static uint8_t test_table[65536] = {
                [0] = 1,
                [513] = 1,
                [1026] = 1,
                [1283] = 1,
                [1796] = 1,
                [2309] = 1,
                [2822] = 1,
            };
            void test()
            {
                uint8_t error = 0;
                for (uint32_t i = 0; i < 65535; i++) {
                    uint8_t expected = test_table[(uint16_t)i];
                    uint8_t actual = get((uint16_t)i);
                    if (actual != expected) {
                        printf("ERROR on %d: expected %d, got %d\n", i, expected, actual);
                        error |= 1;
                    }
                }
                
                if (error) {
                    puts("TESTS FAILED");
                } else {
                    puts("TESTS PASSED");
                }
            }
            
            void init()
            {
                set(0);
                set(513);
                set(1026);
                set(1283);
                set(1796);
                set(2309);
                set(2822);
            }
            
            int main()
            {
                init();
                test();
            }

            https://gcc.godbolt.org/z/WEP66YzTE
            Ответить
            • Недостаточно энтерпрайзно.
              Где фабрики фабрик? Где интерфейсы? Где миксины?
              Ответить
              • Это чистая сишка же
                Ответить
                • [0] = 1 — гэцэцизм?
                  Ответить
                  • хуй знает, но вероятно гость так описывал литерал для массива

                    ну, чтобы не писать 2822 раза 0
                    Ответить
                    • Оказывается, это C99. До C99 это было гнутым расширением.
                      Ответить
                      • Ну так гнутое расширение это стандарт через 10 лет

                        Это как бустня у крестов
                        Ответить
                      • Ещё и для структур инициализаторы. Ты чо забыл как мы писали "АЗАЗА А В КРЕЕСТАХХ ТАКОГО НЕТ"
                        Ответить
                        • Помню, но пришлось уточнять, в каком стандарте появилось.
                          Ответить
                          • Уточни, Alina_Poksenova, какой градус показывает термометр в твоем ректуме?
                            Ответить
                • И как это мешает всё это написать? На сишке даже выглядеть будет более энтерпрайзно (т.е. тонны черезжопного бройлерплейта)
                  Ответить
              • Хуексины.
                Ответить
    • расисты!!!!!!!!!!!1 сегрегаторы!!!!!!!!!!!!!!!!!1
      Ответить
    • C — говно. Тебе ещё какое-то объяснение нужно?
      Ответить
      • Си это один из лучших ЯП, просто не у всех хватает IQ на нём писать
        Ответить
        • Ну разумеется, не все умеют заметать говно под ковёр.
          p.s. как там с юникодой?
          Ответить
      • https://habr.com/ru/post/701338/
        Ответить
    • ура!!!
      https://pbs.twimg.com/media/Fi3pFF0XEAAFXR8?format=jpg&name=large

      Я за нее болел
      Ответить
    • v
      dddd
      Ответить

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