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

    +1000

    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
    bool __fastcall TItsString::operator == (const char* sVal) const
    {
      bool Empty1 = ((FStringValue == NULL) || (FStringValue[0] == 0));
      bool Empty2 = ((sVal == NULL) || (sVal[0] == 0));
      if (Empty1 && Empty2) return true;
      if (Empty1 || Empty2) return false;
      int i,j,k;
      for(i=0; FStringValue[i] && (GET_LOWER_CHAR(FStringValue[i]) == GET_LOWER_CHAR(sVal[i])); i++);
      if ((FStringValue[i] == 0) && (sVal[i] == 0)) return true;
      j=i; k=i;
      if (sVal[k] == 0)  for(; FStringValue[i] == 0x20; i++);
      if (FStringValue[k] == 0) for(; sVal[j] == 0x20; j++);
      if ((FStringValue[i] == 0) && (sVal[j] == 0)) return true;
      return false;
    }

    Запостил: Try, 03 Декабря 2011

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

    • О, опять с гейдева.
      Ответить
    • __фасткал
      Ответить
    • > TItsString
      TIts
      Ответить
    • 1. #include <boost/algorithm/string.hpp>
      2. return boost::to_lower_copy(boost::trim_copy(ar g)) == mymember;
      3. ...
      4. PROFIT
      Ответить
      • трим как бы показывает наличие глубже зарытого говна. или ввод пользователя кто-то не может правильно обработать, либо какой-то херней страдают с пробелами на конце строки.

        ЗЫ а разве в бусте нет простого сравнения без учета регистра?
        Ответить
        • есть - is_iequal
          только раз требуется в объекте case-insensitive сравнение, то я подозреваю, что неплохо бы хранить сразу такой вариант
          но вообще, конечно, достаточно было бы иметь объект, который в конструкторе/операторе =/etc сам себя уже триммит и хранит в одном (нижнем) регистре, и делать bool operator == (sametype const &), воспользовавшись тем, что компилятор сам приведёт типы
          Ответить
          • такое только нужно если ты сравниваешь строки постоянно. иначе из пушке по воробьям.

            если уж ты хочешь что-то в этом духе делать - внутренее кэширование канонического представления строки - то тогда уж лучше создавать эту тримнутую, в нижнем регистре копию не всегда, а только по первому обращению.
            Ответить
            • это потому что никто не знает нахер это всё нужно
              в любом случае trim+is_iequal / trim+to_lower - запишутся в 1-2 строчки
              Ответить
              • если бы мы знали зачем это нужно, то у нас бы не было повода спекулировать. ;)
                Ответить
                • судя по пруфу ниже - кусок очередной гениальной реализации класса строки от программистов игр на продуктах борланд
                  неужели ихний встроенный класс настолько плох?
                  Ответить
                  • и да и нет. по старой памяти, строки в борланде на асме писаны == компилятор не может строчные операции оптимизировать в зависимости от контекста. (а ля С или С++.)

                    например TrimRight() и LoweCase() возвращают новые копии строк. похоже народ трахается с тем что бы избежать создания новых копий строк,
                    Ответить
                    • ака хитрец:
                      http://www.gamedev.ru/flame/forum/?id=155345&page=46#m688

                      defecate-plusplus, твой код украли, см вниз поста)))
                      притом без понимания как он работает, а потому не правильно))))))

                      return boost::to_lower_copy(boost::trim_copy(arg)) == boost::to_lower_copy(boost::trim_copy(FStringValue));
                      Ответить
                      • напиши код чувачку правильно, чтобы он смог покрасоваться перед пацанчиками с гейсдева
                        чё троллишь то?
                        Ответить
                      • пусть копипастят, может наоборот кому то полезным окажется

                        так не сильно неправильно - в данном конкретном случае просто менее эффективно, чем return boost::is_iequal(boost::trim_copy(me), boost::trim_copy(right));

                        а в общем случае - желательно включать голову
                        я лично считаю, что раз есть попытка использовать == для объекта, значит такая операция очень логичная для объекта, значит строку внутри объекта уже следует хранить обрезанной и приведенной в регистр, ну и делать bool myclass::operator == (myclass const & right);
                        тогда всё будет чики-пуки при
                        myclass a = " hello, World! ";
                        return a == " HeLLo, world! ";

                        если же такое сравнение не очень "родное" для объекта, то вместо перегрузки operator == требуется отдельный метод bool myclass::is_iequal_trimmed(somearg);
                        Ответить
                        • все это хорошо, но оно даже не скомпилируется:

                          to_lower_copy принимает минимум 2 параметра
                          == - сравнит указатели а не строки
                          ну и имена переменных не совпадают
                          Ответить
                          • ты всё это к чему?
                            не понял ни одной претензии
                            Ответить
                            • - to_lower_copy принимает 2 аргумента, а не один:
                              http://www.boost.org/doc/libs/1_45_0/doc/html/boost/algorithm/to_lower_copy.html


                              - to_lower_copy в данном случае вернет char*, поэтому == сранивает адреса

                              - ну и название переменной arg не соответсвует названию из параметра функции, но это уже мелоч
                              Ответить
                              • смотри версию с SequenceT
                                надеялся, что это очевидно, что подразумевается именно она и применять её поверх голого char const * не следует совсем
                                даже если в порядке бреда предположить, что нам следует именно использовать char const * в качестве аргумента (а не, что более логично, std::string const &), то вариант с временным std::string, куда будет складываться результат trim_copy через back_insert_iterator, и предварительным выяснением конечного итератора аргумента через strlen получится более сложным и почти таким же по скорости, как банальное обёртывание аргумента в std::string(arg) в указанном выше однострочнике
                                to_lower_copy сможет вернуть char * только если ты напишешь свой собственный велосипедоговнокод с выделением и освобождением памяти в куче
                                Ответить
    • показать все, что скрытолол. говнокодеры продолжают усиливать это говнище
      http://www.gamedev.ru/flame/forum/?id=155345&page=44#m656

      зарегистрируйтесь кто-нибудь там и скажите им: КГ / АМ.
      а то я скоро не выдержусь и зарегистрируюсь.
      Ответить
      • HAHAHA DISREGARD THAT
        Ответить
      • I SUCK COCKS TOO!!!

        Ответить
      • а то я там зарегестрируюсь и выскажу им все
        я ещё ни на одном сайте столько говнища не видел
        и они варются в нем, не понимая этого
        они в полном серьёзе обсуждают этот говнокод превращаего его невесть во что
        Ответить
    • __fastcall это же из Borland c++?
      Ответить
      • Он самый. Еще на c++ builder тут намекают классы в стиле T*.
        Ответить
    • показать все, что скрытоvanished
      Ответить

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