Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
нет там ограничения на допустимые значения. просто повезло что ни один кастомер ни разу за 10 лет значения "-2000" в конфиге не указал - и ошибки синтаксической в конфиге не сделал.
чисто случайно увидел это чудо итальянских технологий. нашел пару десятков мест где эти функции еще используется - на следующей неделе убью это нафиг.
большинство это количества и оффсеты. количества строго положительны - оффсеты могут быть отрицательными. диапазон - short (или -32К до 32К, даже для вещественных чисел).
Любой код, использующий функции группы `ato...` (`atoi`, `atof`) - говнокод по определению. А если эти функции применяются в ситуациях, когда нет уверенности в корректности входа - то говнокод втройне. Именно это мы и наблюдаем в данном случае.
Что интересно, аффтар понимал говнокодовость функций группы `ato...`, но, стремясь ее исправить, создал еще более говнокодовый код. Особенно умиляют проверки на ноль во второй функции. А почему ".0" не вошло?
А ведь надо-то было всего лишь обратить внимание на существование нормальных функций группы `strto...` и танцевать уже от них, вместо того, чтобы избивать мертвые функции группы `ato...`.
Если сравнить strtod() и atof(), то всё преимущество первой сводится к установке errno в ERANGE в случае ошибки, ну и возможности последовательно парсить одну и ту же строку. Так что если в этих фишках необходимости нет, называть применение atof() говнокодом я бы не стал. С целым числами уже разговор другой: strtol() по сравнению с atol() позволяет задавать систему счисления, но, опять таки, если работа идет только с десятичными числами, смысла в этом нет. Поправьте, если ошибаюсь.
Функции группы `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.»
Проверка `in + strlen(in) == endPtr` на самом деле сводится к обычной проверке `*endPtr == '\0'` и не надо никаких `strlen` попусту гонять. `in` на пустоту стоило бы проверить сначала (опять же `*in == '\0'`). Ну и проверять `errno` не надо забывать.
Что имеется в виду? Использование обратного апострофа в качестве кавычки? Так это привычка со stackoverflow - там так "код" выделяется, если надо выделить код inline в тексте.
Гм, думаю, наверное, мысль такая приходила, но почему-то ее решили не делать. В принципе, для большинства фрагментов там представленных это не нужно. Но иногда да, согласен, пришлют какую-нибудь лабу и как ткнуть в нужное место, непонятно.
ЗЫ. Да ладно:) Не ради кармы там, а токмо пользы для!
чисто случайно увидел это чудо итальянских технологий. нашел пару десятков мест где эти функции еще используется - на следующей неделе убью это нафиг.
Что интересно, аффтар понимал говнокодовость функций группы `ato...`, но, стремясь ее исправить, создал еще более говнокодовый код. Особенно умиляют проверки на ноль во второй функции. А почему ".0" не вошло?
А ведь надо-то было всего лишь обратить внимание на существование нормальных функций группы `strto...` и танцевать уже от них, вместо того, чтобы избивать мертвые функции группы `ato...`.
как справедливо заметил калиграфер, место ato* функций - это простые тривиальные программы где обрабатывать ошибки не обязательно.
«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.»
ЗЫ: давайте ссылки, надрочу вам кармы :-Р
ЗЫ. Да ладно:) Не ради кармы там, а токмо пользы для!
для большинства юзеров, там представленных, копипастить - естественный процесс 😀