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

    +3

    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
    #define __DEBUG
    #ifdef __DEBUG
        #define print_pair(p) do{std::cout << "(" << ((p).first + 1) << ", "\
                                << ((p).second + 1) << ")" << std::endl;}while(0);
    #endif
    
    Graph::result
    Graph::dijkstra (int start)
    {
    #ifdef __DEBUG
        std::cout << "Dijkstra algorithm tracing:" << std::endl;
    #endif
        distances[start] = 0;
        std::set<std::pair<int, int>> q;
        q.insert (std::make_pair(distances[start], start));
        while (!q.empty())
        {
    #ifdef __DEBUG
            std::cout << "top element of a set: ";
            print_pair(*q.begin());
    #endif
            int current = q.begin()->second;
            q.erase(q.begin());
            for (int i = 0; i < adj[current].size(); ++i)
            {
    #ifdef __DEBUG
        std::cout << "current vertex: " << (current + 1);
        std::cout << " ad current state of distances array is: " << std::endl;
        for (auto i: distances)
            std::cout << i << " ";
        std::cout << std::endl;
    #endif
                int to = adj[current][i].second;
                int length = adj[current][i].first;
                // Relaxations
                if (distances[to] > distances[current] + length)
                {
    #ifdef __DEBUG
        std::cout << "relaxation for edge (" << current << ", " << to << ") ";
        std::cout << "with weight " << length << std::endl;
    #endif
                    
                    q.erase(std::make_pair(distances[to], to));
                    distances[to] = distances[current] + length;
                    path[to] = current;
                    q.insert(std::make_pair(distances[to], to));
                }
            }
        }
        // Replace INF by -1
        std::replace (distances.begin(), distances.end(), INF, -1);
        return distances;
    }

    Я у мамы решил подебажить как мыщъх дебажил при помощи отладочной печати. Вот что получилось.

    Запостил: HiewMorjowie, 18 Июля 2016

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

    • Ещё один фанат хиев? Ну а в отладочном выводе нет ничего необычного
      Ответить
      • > нет ничего необычного
        Ну кроме того, что лучше какой-нибудь макрос замутить и управлять им в одной точке, а не ебашить #ifdef на каждую строку... Что-нибудь типа:
        // надеемся на оптимизатор, выкидывающий if (0)
        DEBUG() << "relaxation for edge (" << current << ", " << to << ") ";
        // не надеемся на оптимизатор, выкомпиливаем к хуям
        DEBUG("relaxation for edge (" << current << ", " << to << ") ");
        Ну и std::cerr всё-таки, чтобы выхлоп не портить.

        Ну и вместо #define print_pair(p) шаблончик бы. Няшно и полезно даже не в дебажном коде...
        Ответить
        • > выкидывающий if (0)
          if(!all_human_is_shit())//it's always true condition. 
          //just joke for regretful boss. shot only after my dismissal. 
          DEBUG() << "relaxation for edge (" << current << ", " << to << ") ";
          else
          killallhuman();//упс
          Ответить
          • are
            Ответить
            • Ну Аврора выстрелит, если
              #define DEBUG() if(0) std::cerr
              Ответить
              • да не знаю я что там с авророй, если пишется all, то используется множественное число, если every, то единственное
                Ответить
                • не всегда. зависит от типа того к чему all отностится: качественное vs количественное:

                  all_humane_is_shit
                  all_humans_are_shit
                  Ответить
                • Весь человек - говно.
                  Ответить
                  • В каждом маленьком ребёнке,
                    И в мальчишке, и в девчонке
                    Есть по триста грамм какашек
                    Или даже полкило.

                    А в огромных дядях, тётях
                    Их, конечно же, побольше.
                    Иногда и так бывает:
                    Целый человек — говно.
                    Ответить
                    • )))))))))какая прелесть
                      Ответить
                      • Жаль, что это копипаста. Я уже и не помню, где это подцепил.
                        Ответить
                        • похоже на пирожок

                          но вообще оригинальная песенка (из мультика про обезъян) на фоне исламизма приобрела особый смысл
                          Ответить
                • А кстати когда лучше every использовать, а когда all?
                  Ответить
              • Ну ок, if (1) {} else.
                Ответить
            • all your base belong to us
              Ответить
    • а как же __LINE__, __FILE__?
      Ответить
    • > #ifdef __DEBUG
      В рантайме нужно уметь включать всё это.
      Ответить
      • #define DEBUG_ENABLED true
        //...
        static bool debug_enabled = DEBUG_ENABLED;
        //...
        if (!strcmp(argv[i],"-debug") debug_enabled = true;

        Так?
        Ответить
        • Нет. Для рантайма так:
          #define ROOSTER_DEBUG_PRINT(debug_level, ...) \
              if (g_debug_level > debug_level) { \
              /* printf with __FILE__, __LINE__, date and time and goose fucking goes here */ \
              }


          А debug_level задаётся через .kokoko.rc или argv.

          А для годного дебуга так:
          #ifndef CONDENSED_MILK_DEBUG
          #define ROOSTER_DEBUG_PRINT
          #else
          #define ROOSTER_DEBUG_PRINT printf("Fuck a goose\n");
          #endif
          Ответить
          • > #define ROOSTER_DEBUG_PRINT printf("Fuck a goose\n");
            Точка с запятой в конце нинужна.
            Ответить
            • А магия с do{}while(0) нужна?
              Ответить
              • С ней хотя бы не надо думать, после каких стейтментов, напоминающих функции, надо ставить точку с запятой, а после каких - нет.

                З.Ы. В крестах и так граблей полно, зачем ещё свои приносить и раскладывать?
                Ответить
              • Когда как. Если впадлу копипастить кококод и есть временные переменные - НУЖНО.
                Ответить
          • Что такое конденсированное молоко? Что-за питушинный мем?
            Ответить
        • Н-но сенпай, а как же уровни логгирования по подсистемам? Файл с конфигой логгинга, inotify, вот это всё... Без этого в ынтерпрайз не возьмут!
          Не забыть ещё трейсить парсер этого конфига.
          Ответить
          • >>уровни логгирования по подсистемам?
            кто-то реально пользуется?

            я думал все только пиздят пафосно, а на самом деле всё срется в один файл log.txt, в котором потом админы и программеры ищут что им нужно в куче мусора и говна, разве нет?
            Ответить
            • У нас есть такое.
              Ответить
              • может у вас проекте еще и хардкода, копипасты и тупых багов нету? и тесты на все записаны? и знания о гуи и БД не перемешаны в кучу?
                Ответить
            • > а на самом деле всё срется в один файл log.txt

              Зачем так грустно, есть же syslog с роутингом по тэгам.
              Ответить
              • по тэгам?
                в сислог есть северити и фасилити
                разве нет?
                или ты фасилити тегом назвал?
                Ответить
                • > в сислог есть северити и фасилити
                  разве нет?

                  Это зависит от реализации. Стандарт много чего описывает, вплоть до возможности передавать произвольные структурированные метаданные.

                  Мы используем syslog-ng, он умеет фильтрацию по APP-NAME, который содержится в сообщении
                  https://tools.ietf.org/html/rfc5424#section-6.2.5
                  Похожие фичи есть в rsyslog.
                  Ответить
              • Фильтрация записей на клиентской стороне лучше, пирфоманс же. Можно включить подробные дебаги прямо онлайн во время низкой нагрузки, например.
                Плюс если записи сливаются в хитрый буфер, а не в log.txt, то сам царь носа не подточит.
                Ответить
                • > пирфоманс же

                  Обвязки много писать пад сибя, не всегда оно того стоит.

                  Кмк, в условиях ограниченных временных ресурсов проще писать в лог только внятные полезные сообщения, которые потом помогут понять контекст и осознать причины, чем городить динамическую опердень, чтобы потом разгребать в логах произвольные "азаза прочитал 10 байт".

                  Ну и в сторонние либы заинтегрировать логгинг иногда весьма проблематично (I'm looking at you, libzookeeper), поэтому приходится довольствоваться тем, что есть.
                  Ответить
          • Ынтерпрайз для петухов.
            Ответить

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