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

    +133

    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
    bool findImageToleranceIn(CTSInfo *info, bitmap *imageToFind, int32_t *x, int32_t *y, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint16_t tolerance)
    {
        int I, J, XX, YY;
        info->tol = tolerance;
        int dX = (x2 - x1) - (imageToFind->width - 1);
        int dY = (y2 - y1) - (imageToFind->height - 1);
        for (I = 0; I < dY; ++I)
        {
            for (J = 0; J < dX; ++J)
            {
                for (YY = 0; YY < imageToFind->height; ++YY)
                {
                    for (XX = 0; XX < imageToFind->width; ++XX)
                    {
                        rgb32* pixel = &imageToFind->pixels[YY * imageToFind->width + XX];
                        rgb32* targetPixel = &info->targetImage->pixels[(YY + I) * info->targetImage->width + (XX + J)];
                        if (pixel->a != 0)
                        {
                            if (!(*info->ctsFuncPtr)(info, pixel, targetPixel))
                            {
                                goto Skip;
                            }
                        }
                    }
                }
                *x = J + x1;
                *y = I + y1;
                return true;
                Skip:
                continue;
            }
        }
        *x = -1;
        *y = -1;
        return false;
    }

    В чём здесь сакральный смысл GoTo?

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

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

    • чтобы выпрыгнуть из двух внутренних циклов. не?
      Ответить
      • Да не похоже, я даже никак не пойму логику возврата true. Циклы то не делают нихрена вообщем то. Разве бессмысленное присваивание.
        Ответить
        • Как это циклы ни хрена не делают? Они последовательно вызывают функцию ctsFuncPtr, сравнивая с её помощью разные пикселы двух изображений. Если внутренний цикл по YY полностью отработал, и функция ctsFuncPtr ни разу не вернула false, то выполнение findImageToleranceIn на этом заканчивается с возвратом true.
          Если же ctsFuncPtr возвращает false, то работа двух внутренних циклов прерывается, и мы переходим (при помощи goto) к следующему шагу внешних циклов. Goto здесь используется вместо кошерного break, потому что надо выйти сразу из двух внутренних циклов, break выходит только из самого внутреннего.
          Ответить

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