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

    +105

    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
    #define C_WRONG              -2000
    
    ....
    
    int tttt_atoi(char* p_string){
    
       int result = C_WRONG;
    
       if ( *p_string < '0' || *p_string > '9' )
          return C_WRONG;
    
       result = atoi(p_string);
       return result;
    }
    
    double tttt_atof(char* p_string){
    
       double result = C_WRONG;
       result = atof(p_string);
       if (result!=0){
          return result;
       }
       else{
          if(strcmp(p_string,"0.0")==0 || strcmp(p_string,"0")==0 || strcmp(p_string,"0.")==0){
             return result;
          }
          else{
             return C_WRONG;
          }
       }
    }

    и вы посмейтесь. или facepalm'нитесь. синтакс оригинала.

    Запостил: Dummy00001, 04 Марта 2011

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

    • А почему -2000, а не 42?
      Ответить
      • -2000 вне диапазона, а 42 - нет
        Ответить
        • У tttt_atof входит в диапазон
          Ответить
          • я про диапазон допустимых значений по контексту, а не по самим функциям
            Ответить
            • нет там ограничения на допустимые значения. просто повезло что ни один кастомер ни разу за 10 лет значения "-2000" в конфиге не указал - и ошибки синтаксической в конфиге не сделал.

              чисто случайно увидел это чудо итальянских технологий. нашел пару десятков мест где эти функции еще используется - на следующей неделе убью это нафиг.
              Ответить
              • Что задает число в конфиге?
                Ответить
                • большинство это количества и оффсеты. количества строго положительны - оффсеты могут быть отрицательными. диапазон - short (или -32К до 32К, даже для вещественных чисел).
                  Ответить
    • tttt_facepalm.pcx
      Ответить
    • Любой код, использующий функции группы `ato...` (`atoi`, `atof`) - говнокод по определению. А если эти функции применяются в ситуациях, когда нет уверенности в корректности входа - то говнокод втройне. Именно это мы и наблюдаем в данном случае.

      Что интересно, аффтар понимал говнокодовость функций группы `ato...`, но, стремясь ее исправить, создал еще более говнокодовый код. Особенно умиляют проверки на ноль во второй функции. А почему ".0" не вошло?

      А ведь надо-то было всего лишь обратить внимание на существование нормальных функций группы `strto...` и танцевать уже от них, вместо того, чтобы избивать мертвые функции группы `ato...`.
      Ответить
      • О каких функциях `strto...` идет речь?
        Ответить
        • Видимо о strtod, strtol, strtoll и остальных
          Ответить
          • Если сравнить strtod() и atof(), то всё преимущество первой сводится к установке errno в ERANGE в случае ошибки, ну и возможности последовательно парсить одну и ту же строку. Так что если в этих фишках необходимости нет, называть применение atof() говнокодом я бы не стал. С целым числами уже разговор другой: strtol() по сравнению с atol() позволяет задавать систему счисления, но, опять таки, если работа идет только с десятичными числами, смысла в этом нет. Поправьте, если ошибаюсь.
            Ответить
            • ato* функции не поддерживают по человечески обработку ошибок == говно по определению.

              как справедливо заметил калиграфер, место ato* функций - это простые тривиальные программы где обрабатывать ошибки не обязательно.
              Ответить
            • Функции группы `ato...` не предоставляют никаких средств обработки ошибочных ситуаций. Это делает их практически неприменимыми. Для конвертации строк в числа предназначены функции группы `strto...`
              Ответить
            • Ну, в стандарте говорится, что ибо нефиг:
              «The atof() function is subsumed by strtod() but is retained because it is used extensively in existing code. If the number is not known to be in range, strtod() should be used because atof() is not required to perform any error checking.»
              Ответить
      • я тут недавно говнокодил одно лабе, парсил так
        bool tryParse(const char* in, double& out)
        {
        	char * endPtr;
        	out = strtod (in,&endPtr);
        	return in + strlen(in) == endPtr && strlen(in) != 0;
        }
        Ответить
        • Проверка `in + strlen(in) == endPtr` на самом деле сводится к обычной проверке `*endPtr == '\0'` и не надо никаких `strlen` попусту гонять. `in` на пустоту стоило бы проверить сначала (опять же `*in == '\0'`). Ну и проверять `errno` не надо забывать.
          Ответить
          • что `это` за `хрень`?
            Ответить
            • системный вызов, конечно.
              Ответить
            • Что имеется в виду? Использование обратного апострофа в качестве кавычки? Так это привычка со stackoverflow - там так "код" выделяется, если надо выделить код inline в тексте.
              Ответить
              • пффф, стековерфловочка...
                Ответить
                • А чо? Я вот тоже недавно там задал вопрос... И как-то втянулся:)
                  Ответить
                  • сей говносайтик заслуживает эпитета "мудацкий" уже потому, что никто из тамошних быдлокодеров не догадался приделать нумерацию строк у <code>

                    ЗЫ: давайте ссылки, надрочу вам кармы :-Р
                    Ответить
                    • Гм, думаю, наверное, мысль такая приходила, но почему-то ее решили не делать. В принципе, для большинства фрагментов там представленных это не нужно. Но иногда да, согласен, пришлют какую-нибудь лабу и как ткнуть в нужное место, непонятно.

                      ЗЫ. Да ладно:) Не ради кармы там, а токмо пользы для!
                      Ответить
                      • > для большинства фрагментов там представленных это не нужно
                        для большинства юзеров, там представленных, копипастить - естественный процесс :-D
                        Ответить
                    • номера строк на SO бесполезны, потому что вопросы/ответы можно редактировать/корректировать/т.д что влечь смену номеров строк.
                      Ответить
                      • В таком случае и обсуждение вести бессмысленно - а если топикстартер пост подправит как следует ?
                        Ответить

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