1. Список говнокодов пользователя burdakovd

    Всего: 12

  2. C# / Говнокод #8845

    +122

    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
    while (!requestedTermination)
    {
        // ...
        // тут  130 строк кода...
        // ...
    
        if (requestedTermination)
        {
            break;
        }
        else
        {
            // to prevent excess CPU usage
            Thread.Sleep(100);
        }
    }

    requestedTermination - Property, изменяемое другим потоком

    Мораль: не пишите длинные циклы - к концу цикла забудете, какое у него было условие завершения.

    burdakovd, 16 Декабря 2011

    Комментарии (12)
  3. Lua / Говнокод #7195

    −92

    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
    -- async IO operations
    -- op1.asyncRun(cb) - execute op1, and call cb(op1_result) after op1 completion
    
    -- op1 * g - new async operation which will execute op1.asyncRun(), then execute g(op1_result).asyncRun() and return op2_result
    -- op1 .. op2 - the same, but ignore result of op1. Will execute op1.asyncRun(), then op2.asyncRun() and return op2_result
    private.binder = {
    __mul =
            function(op1, g)
                local op = {
                    asyncRun =
                        function(cb)
                            op1.asyncRun(
                                function(op1_result)
                                    g(op1_result).asyncRun(cb)
                                end
                            )
                        end
                }
                setmetatable(op, private.binder)
                return op
            end,
    
    __concat =
            function(op1, op2)
                 return op1 * function(op1_result) return op2 end
            end,
    
    __metatable = 1
    }
    
    -- примеры использования:
    -- (Chatter.IO.Log("tic") .. Chatter.IO.Sleep(1000) .. Chatter.IO.Log("tac") .. Chatter.IO.Sleep(1000) .. Chatter.IO.Log("toe")).asyncRun(function() end)
    -- (Chatter.IO.GetTime * Chatter.IO.Log .. Chatter.IO.Sleep(1000) .. Chatter.IO.GetTime * Chatter.IO.Log).asyncRun(function() end)

    Lua.

    burdakovd, 07 Июля 2011

    Комментарии (5)
  4. C++ / Говнокод #6391

    +163

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    int F(x)
    {
       if (.chto-to) v.push_back(.koe-chto.);
       int ind = somefunc(x);
       for each y in x.childs
          v[ind].res += F(y);
    }

    Не говнокод, но пример того, как из std::vector можно выстрелить себе в ногу

    Комментарий автора кода ( http://codeforces.ru/blog/entry/1719#comment-32824 ):
    такая штука получала крэш на компиляторе жюри, из-за того что сначала вычислялся адрес v[ind].res затем вызывалась снова F, которая пушбекает в вектор v, и может тем самым заставить вектор перевыделить память, тем самым адрес вычисленный ранее становился инвалидным.
    я этот баг долго не мог найти, потомучто студия генерила нормальный код, не вызывающий креша

    burdakovd, 18 Апреля 2011

    Комментарии (6)
  5. Куча / Говнокод #6198

    +135

    1. 1
    ^(?:[^<>]*<[^<>]+>)+?[ \n\t]*Вопрос №\d+\:[ \n\t]*((?:<[^<>]+>[^<>]*)+?)(?:<table>|<table [^<>]*>)[ \n\t]*(?:<tr>|<tr [^<>]*>)[ \n\t]*(?:<td>|<td [^<>]*>)[^<>]*(?:(?:(?:(?:<div>|<div[ \n\t]*[^<>]*>)|</div>|<div[ \n\t]*?/[ \n\t]*?>)|(?:(?:<p>|<p[ \n\t]*[^<>]*>)|</p>|<p[ \n\t]*?/[ \n\t]*?>)|(?:(?:<font>|<font[ \n\t]*[^<>]*>)|</font>|<font[ \n\t]*?/[ \n\t]*?>)|(?:(?:<html>|<html[ \n\t]*[^<>]*>)|</html>|<html[ \n\t]*?/[ \n\t]*?>)|(?:(?:<body>|<body[ \n\t]*[^<>]*>)|</body>|<body[ \n\t]*?/[ \n\t]*?>)|(?:(?:<head>|<head[ \n\t]*[^<>]*>)|</head>|<head[ \n\t]*?/[ \n\t]*?>)|(?:(?:<span>|<span[ \n\t]*[^<>]*>)|</span>|<span[ \n\t]*?/[ \n\t]*?>)|(?:(?:<style>|<style[ \n\t]*[^<>]*>)|</style>|<style[ \n\t]*?/[ \n\t]*?>)|(?:(?:<title>|<title[ \n\t]*[^<>]*>)|</title>|<title[ \n\t]*?/[ \n\t]*?>)|(?:(?:<br>|<br[ \n\t]*[^<>]*>)|</br>|<br[ \n\t]*?/[ \n\t]*?>)|(?:(?:<img>|<img[ \n\t]*[^<>]*>)|</img>|<img[ \n\t]*?/[ \n\t]*?>)|(?:(?:<meta>|<meta[ \n\t]*[^<>]*>)|</meta>|<meta[ \n\t]*?/[ \n\t]*?>))[^<>]*)*Вариан

    Продолжение (8 килобайт, сюда не влазит): http://pastie.org/1750060
    Регулярка безусловно генерится, но всё равно ГК.

    burdakovd, 03 Апреля 2011

    Комментарии (3)
  6. Python / Говнокод #5149

    −172

    1. 1
    time.strftime('%Y/%m/%d', time.localtime(time.time()+86400))

    Вычисление завтрашней даты.
    В день перехода на зимнее время этот код не будет работать.
    До сих пор не знаю, как это сделать правильно.

    burdakovd, 05 Января 2011

    Комментарии (3)
  7. Куча / Говнокод #4946

    +131

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    orig_labels = sort(unique(Y));
        Y_new = Y;
        new_labels = 1:length(orig_labels);
        
        for i=1:length(orig_labels)
            Y_new(find(Y==orig_labels(i)))=Inf;
            Y_new(isinf(Y_new))=new_labels(i);
        end
        
        Y = Y_new;

    Matlab. Масштабирование. То есть типа вектор [100 230 400 300 230] переводится в [1 2 4 3 2].

    Можно было сделать внутри цикла "Y_new(Y == orig_labels(i)) = i".

    Побочным эффектом стало то, что если Y имеет элементы с типом не double, а int32 к примеру, то Inf превращается в maxint32, проверка isinf() возвращает false и код внезапно не работает.

    burdakovd, 16 Декабря 2010

    Комментарии (3)
  8. C++ / Говнокод #4604

    +163

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    std::vector<double> WBuffer;
    std::vector<double> CleanWBuffer;
    std::vector<Color> PixelBuffer;
    std::vector<Color> CleanPixelBuffer;
    
    void Scene3D::ClearBuffers()
    {
            const size_t n = static_cast<size_t>(ScreenSize[0] * ScreenSize[1]);
    
            memcpy(&*(WBuffer.begin()), &*(CleanWBuffer.begin()), n * sizeof(*(WBuffer.begin())));
            memcpy(&*(PixelBuffer.begin()), &*(CleanPixelBuffer.begin()), n * sizeof(*(PixelBuffer.begin())));
    }

    Быстрая очистка буферов.
    CleanWBuffer предварительно заполнен 0.0, CleanPixelBuffer предварительно заполнен нужным цветом.

    Можно было воспользоваться std::fill, но оно работает в несколько раз дольше.


    Пришлось так вот лезть в потроха std::vector. Доставляют подряд идущие & и *.

    burdakovd, 12 Ноября 2010

    Комментарии (39)
  9. C++ / Говнокод #4602

    +157

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    void Scene3D::DrawTriangle(const Point3D &A, const Point3D &B, const Point3D &C, const Color& color)
    {
            // ---------------------------------------------------------------------------------------
            // вспомогательные вычисления
            // нормаль
            const Vector3D& n = (B - A) ^ (C - A);
    
            // ...
    
            // центр треугольника
            const Point3D& medium = (A + B + C) / 3.0;

    Руки как-то привыкли const TypeName& variableName набирать в определении параметров методов.
    И случайно набралось такое (строки 6, 11)

    Операторы (+, -, ^, /) над векторами возвращают Vector3D, не const Vector3D&.

    Заметил только через полгода, и всё это время оно почему-то работало, и даже ворнингов не было.

    Но такое ведь не должно работать!
    Результат вычисления в правой части присваивания структура, то есть она возвращается в стеке. Если бы я присвоил её какой-то локальной переменной, для которой выделена память в стеке текущей функции, то она бы перед удалением скопировалась в локальную переменную. А так получается что ссылка (n, medium) указывает куда-то на стек, где временно хранится возвращенное оператором значение. И при следующем вызове любой функции эта область стека должна перезаписаться.

    burdakovd, 12 Ноября 2010

    Комментарии (7)
  10. Python / Говнокод #4466

    −165

    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
    def getrows(c):
        return \
            sum( # суммируем по категориям
                map(
                    lambda category:
                        sum( # суммируем по itemid
                            map(
                                lambda itemidset:
                                    sum( # суммируем по itemstring
                                        map(
                                            lambda itemstring:
                                                map(
                                                    lambda info:
                                                        transaction(category, itemstring, info),
                                                    itemidset[itemstring].values()
                                                ),
                                            itemidset.keys()
                                        ),
                                    []),
                                c[category].values()
                            ),
                            []
                        ),
                    ("completedAuctions", "failedAuctions", "completedBidsBuyouts")
                ),
                []
            )

    Залез в свой старый скрипт, генерирующий отчеты, думал кое-что подправить...
    Увидел одну из функций (эту) и решил лучше забить тут что-то править хД

    Причины такого ужаса - наверно отсутствие явной типизации в питоне и средств рефакторинга (rename variable, extract method, ...) в "IDE"

    burdakovd, 27 Октября 2010

    Комментарии (17)
  11. Java / Говнокод #4382

    +75

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    StringUtils.join(
                    Collections2.transform(Arrays.asList(ArrayUtils.toObject(data)),
                            new Function<Byte, String>() {
    
                                @Override
                                public String apply(final Byte from) {
                                    return "0x" + Integer.toHexString(from);
                                }
                            }), " ")

    data имеет тип byte[]

    в питоне это было бы ' '.join(map(hex, data))

    burdakovd, 18 Октября 2010

    Комментарии (7)