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

    +159

    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
    void shiftOrder(int* _order, int _count, int _column)
    {
        int i=_count-1;
        while ( _order[i]!=_column )
            i--;
    
        _order[_count]=_order[i];
        memcpy( _order+i, _order+i+1, (_count-i)*sizeof(int) );
    
        return;
    }
    
    void returnOrder(int* _order, int _count, int _column)
    {
        int i=0;
        int j=0;
        int order[MAX_COLS];
    
        for ( i=0; i< _count; i++)
        {
            if ( m_ColInfo[i].visible )
            {
                order[j]=i;
                j++;
            }
        }
    
        i=j;
        while ( j<_count )
        {
            if ( _order[i-1]!=_column )
            {
                order[j]=_order[i-1];
                j++;
            }
            i++;
        }
        memcpy(_order, order, MAX_COLS*sizeof(int));
    
        return;
    }

    я знаю, это всё торфяники!1

    Запостил: ilardm, 30 Июля 2010

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

    • > memcpy( _order+i, _order+i+1, (_count-i)*sizeof(int) );

      Красивый приём, только к чему тут 7я строчка?
      Ответить
      • >Красивый приём
        В чем красота ?
        При (_count-i) > 1 будет не пойми что, т.к. области перекрываются.
        Ответить
        • В том и красота, что одно значение расходится по всему массиву, как раз из-за того, что области перекрываются.
          Ответить
          • Почитал бы мануал, прежде чем писать.
            Ответить
            • Короче, ладно, тут я слил, просто есть такой прикол, что заполнение массива одним значением быстрее через movsd, чем через stosd
              Ответить
              • В некоторых случаях memcpy() лучше вообще развернуть в несколько присваиваний.
                Но тут-то речь совсем не об оптимизации. И ассемблер не к месту, тем более что речь идет о Си.
                Во что развернутся те или иные функции зависит от компилятора и его настроек.
                Ответить
      • для этого есть memmove
        Ответить
      • там массив с запасом, а _count вычисляется во время работы и за пределы не выходит. а 7й строчкой мы кидаем значение в конец и потом всё сдвигаем влево. теоретически :)
        Ответить
        • >там массив с запасом
          С каким запасом? Берутся смежные элементы и накладываются друг на друга.
          Косяк в явном виде.
          >теоретически :)
          А должно быть практически.
          Ответить
          • _count - человекочитаемая величина, т.е. реальный размер _count-1
            Ответить
            • >человекочитаемая величина
              Это что ещё за термин?
              Была машинопись, а теперь человекочитаемость :)
              Ответить
              • это когда Вы создаёте массив из 5ти элементов, но индексы-то начинаются с 0.
                в данном случае 5 - человекочитаемая величина, а 4 - индекс последнего элемента.
                PS торфянники всё ещё действуют :)
                Ответить
          • > Берутся смежные элементы и накладываются друг на друга.
            Косяк в явном виде.

            До тебя не дошло что ли, что так и задумано, а , минусатор?
            Ответить
            • -
              Ответить
            • movsd быстрее, чем stosd, вот в чём пикол тут.
              Ответить
            • С точки зрения ГК задумано оч.хорошо :)
              Ещё раз повторю, если не понял, что когда области пересекаются memcpy() не подходит.
              А в данном случае они будут пересекаться когда (_count-i) > 1.
              P.S. А что тебе минусы глаза режут? Так не пиши всякий бред и минусов не будет.
              Ответить
        • Зачем кидать его в конец, если следующая строчка всё равно весь хвост массива присвоит одному значению?
          Ответить
          • надо кинуть элемент в хвост(простой append, массив с запасом, так что последний элемент не потеряется) и сдвинуть все последующие элементы на один влево
            Ответить
            • Строчка номер 8 приведёт к одному значению фрагмент массива от _order+i до _order+i + (_count - i) = _order+_count
              7я строчка не нужна, проверь
              Ответить
              • и всё ещё не верю.
                _order+i + (_count - i) -- это вообще откуда?
                _count -- *количество* элементов. индекс последнего -- _count-1
                7й строкой копируем iй элемент /за пределы/ массива
                8й копируем элементы с i+1 в i в количестве сколько элементов от iтого до конца с учётом толькочто скопированного. -- К.О.
                или я всё ещё чего-то не понял?
                Ответить
                • Ааа, у вас же наоборот всё, сначала куда, потом откуда. То есть просто массив сдвигается, всё, извините все, понял.
                  Ответить
    • а в чём сакральный смысл использования подчеркивания первым символом имени переменной?
      Ответить
      • типа имена параметров такие же как и имена пропертей класса.
        чтоб различать их. можно и так this->name=name
        ----
        К.О.
        Ответить
        • В С++ нет пропертей. К тому же, где здесь С++ ?
          Ответить
          • хорошо. членов классов.
            и пример выдран из контекста, так что да, конкретно тут нет плюсов.
            Ответить
            • это Си, без малейшего намёка на С++
              (даже имена функций говорят, об этом)

              подчёркивание в начале:
              - мб аффтор таким образом хотел выделить: "это параметры функции"
              Ответить
              • именно это и хотел.
                а функции на самом деле - методы класса. просто класс опустил за ненадобностью.
                Ответить
        • Обычно делают наоборот.
          Члены класса с подчеркиванием.
          И как советует Саттер - лучше в конце.
          Ответить
          • а человеки, испорченные MFC делают так: m_name
            А ещё они классы как CClass обзывают.
            И да, я объектно-ориентированное программирование с MFC начинал.
            Ответить

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