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

    −30

    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
    BOOL CIniFile::LoadIniFile()
    {
      CString csBuff;
      CFile oIniFile;
      if (oIniFile.Open(csIniFileName, CFile::modeRead))
      {
        ULONGLONG lenReal = oIniFile.GetLength();
        DWORD dwLen = (DWORD) lenReal;
        if (lenReal > UINT_MAX)
        {
          dwLen = UINT_MAX;
          TRACE("ERROR: CIniFile::LoadIniFile();  CFIle::GetLength() > UINT_MAX\n;");
          ASSERT(0);
        }
        if (!dwLen)
          return FALSE;
        boost::scoped_array <char> cBuffer(new char[dwLen]);
        oIniFile.Read(cBuffer.get(), dwLen);
        LoadIniFromBuffer(cBuffer.get(), dwLen);
        oIniFile.Close();
        if (GetCountRecords())
          return TRUE;
      }
      return FALSE;
    }

    boost::scoped_array... nuff said =(

    Запостил: kovyl2404, 05 Июня 2012

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

    • Программист "без царя в голове", о чём можно судить даже по бессистемным именам переменных:
      > lenReal
      > dwLen
      "len" идёт то как префикс, то как постфикс.
      Хотя, может быть это эффект того, что над кодом работал не один человек...
      Ответить
      • Над проектом работало три-четыре человека. Как я понял больные на голову. Что уж говорить, я месяц занимаюсь этим проектом и до сих пор не смог его даже собрать 0_о
        Ответить
    • пф
      про scoped_array гугл подсказал, а про program_options нет
      Ответить
    • показать все, что скрытоКГ / АМ!
      Ответить
    • Что не так с boost::scoped_array?
      Ответить
      • Уж с ним-то все отлично. Вон defecate-plusplus парой коментов выше разъяснил мое недовольство =)
        Ответить
        • Ну буст - штука необъятная, весь сходу не заучишь. Мне как-то тоже не всегда приходит в голову искать в нём то, что и так несложно написать. Другое дело - после того как разок носом ткнут (или сам ткнусь случайно). С аргументацией, а точно ли оно мне надо.
          Ответить
          • Да понятно, что буст - огроменная помойка. Но раз уж решили ее притянуть в проект, то лучше ж все-таки убедиться (читай "погуглить"), а нет ли в ней того, что собираетесь писать. Кстати, во всем проекте буст используется лишь с такой оригинальной целью, которую я продемонстрировал.
            Ответить
      • показать все, что скрыто>Что не так с boost::scoped_array?
        Не нужен. Use std::vector, Luke! Познай силу тёмной стороны.
        Ответить
        • Я лично предпочитаю называть вещи своими именами. Если мне нужен простой массив фиксированного (пусть и неизвестного на этапе компиляции) размера, который требуется вовремя удалить, то я его и создаю. Перед векторами изначально ставятся несколько другие (хоть и совместимые) цели. И sizeof у них побольше будет (в той реализации STL, которая в VS2008 - в пять раз, по крайней мере для 32-битной платформы). Мелочь? Может быть, но зачем всё это нужно при наличии простой и специализированной альтернативы?

          Конечно, об извратах типа подключения к проекту целого буста ради одного scoped_array я сейчас не говорю. Но уж если подключать ради чего-то другого, то грех не пользоваться.
          Ответить
          • Вы так говорите, как-будто буст это что-то огромное (типа дебажного QtGui) и линкуемое в проект целиком.
            Ответить
            • Хрен с ней с линковкой - я уже задолбался его при каждом удобном случае (вроде обновления или старта нового проекта) копировать, забирать из сорс-контрола, заливать обратно, запаковывать/распаковывать и т.п.. Десятки тыщ мелких файлов жрут время не хуже длинной линковки.
              Ответить
              • простите, зачем буст хранить в сурсконтроле? вы его улучшаетередактируете чтоли?
                и при обновлении или старте нового проекта настройка вашего рабочего места программиста начинается с переустановки винды?
                Ответить
                • Ну вот так уж у нас принято - сторонние либы (их много), которые используются, лежат рядом с проектом. Чтоб не искать потом нужные версии (даже буст иногда грешит breaking change'ами) по всем интернетам. Кстати да, некоторые заброшенные извращения вроде libtga и редактировать иногда приходится.

                  Переустановка винды здесь ни при чём, просто некоторые особенности некоторых сорс-контролов + время от времени необходимость работать из разных мест (из дома, например).

                  Буст, впрочем, давно руки тянутся обрезать до минимально необходимой части, благо средства есть. Рано или поздно дотянутся.
                  Ответить
                  • это у вас плохо принято
                    когда буст используется в 100% проектов, его не нужно держать рядом с проектом
                    вы же не держите рядом с проектом в сурс-контроле VC/include, правда?
                    а то ведь тоже может так случиться, что дома стоит другая версия студии ;)

                    насчет breaking changes - я на работе его пользую где-то с версии 1.37, да, бывали случаи, но очень не критичные (один раз хедер надо иначе было включить, один раз дописать #define перед включением, один программист полюбил писать boost::system::system_category вместо get_system_category() - и спасибо что в какой то версии это выпилили наконец, ошибка ведь) - случаев очень немного было за 4 года, это не создает непреодолимых проблем

                    и на практике регулярный переход с 1.37 до 1.49 (иногда, быть может, с пропуском через 1-2) за эти годы ни разу не сломал ни один проект, ни один важный проект, во время их работы в поле
                    тестирование то понятное дело без нареканий

                    поэтому держать рядом с каждым проектом зоопарк всех версий буста - это всё от лени "да он тут чото ругается теперь, нунах" и страха "а ну как всё сломается, а я крайний"
                    не сломается
                    Ответить
                    • > это у вас плохо принято

                      Нас это пока устраивает и регулярно себя оправдывает. Другая версия студии - плохой пример. Последнее, что помню из засад при обновлении буста - новая версия filesystem, замена вызовов path::string() на path::generic_string() по всему коду и ещё несколько прелестей, которые уже успел забыть. Хотя от этой конкретной либы нам вообще давно пора избавиться (пользовались только ради удобной работы с путями, а либа упорно затачивается на совсем другое).

                      Ну и вообще-то мы не "зоопарк всех версий" держим, а одну конкретную, с которой компилировали. Когда требуется выдать компилируемый код наружу (для портирования, или просто издателю для порядка), это делается простым копированием "как есть" (с обрезанием разве что объектных файлов или ещё чего-нибудь явно ненужного) и упаковкой. Когда нужно посадить на проект нового программиста - он просто забирает всё из перфорса и радуется жизни.

                      Может быть, в каких-то конкретных ситуациях это и "не нужно", но в нашей это работает и нам удобно. Практическую пользу от того, чтобы делать именно так, я вижу. От того, чтобы так не делать - разве что экономия места на серверах (не моя проблема, если честно).
                      Ответить
                      • > filesystem
                        >> один раз дописать #define перед включением
                        #define BOOST_FILESYSTEM_VERSION 2
                        #include <boost/filesystem.hpp>
                        fixed
                        Ответить
                        • Version 2 is deprecated, and will not be included in Boost releases 1.48 and later.

                          (c)

                          Между тем, уже 1.49. Честно говоря, не проверял - сдержали слово?
                          Ответить
                          • ага, наверное поэтому оно у меня и в 1.49 работает без проблем

                            она станет deprecated только когда С++11 с копипащеной реализацией filesystem v2 предложит std::filesystem

                            в общем эту проблему в 1.46 или когда там появился v3 я решил именно так и это решение до сих пор отлично работает
                            что будет в 1.50 - не знаю, думаю, останется по-старому
                            Ответить
                            • Ну я бы не стал на это расчитывать. Предпочитаю подстраховаться.

                              В домашнем проекте я эту проблему решил кардинально - выбросил надоевший filesystem и написал несколько своих функций, которые делают то и только то, что мне было от него нужно, именно таким способом, который меня для моих задач полностью устраивает.
                              Ответить
                              • ну сломают окончательно - придется решать, и именно переходом на v3 везде, а не добавлением устаревшего буста к проектам
                                в filesystem не только склеивание путей, там еще и итерирование по директории, копирование и удаление файлов, размер файлов
                                и когда всё это надо делать кроссплатформенно, свой велосипед оказывается в проигрышном положении
                                Ответить
                                • Для кроссплатформенной работы непосредственно с файлами мы используем PhysicsFS. "Родная" файловая система при этом нас вообще не волнует, т.к. в релизе все ресурсы идут упакованными в архив. Единственное, что требует-таки работы с родной фс - это сейвы, но их (выбор места и непосредственно запись в файл) как раз можно оставить платформенно-зависимым кусочком.
                                  Ответить
                      • > Ну и вообще-то мы не "зоопарк всех версий" держим, а одну конкретную, с которой компилировали.
                        именно про это я и говорю, если у вас один проект, использующий буст, то разницы, конечно, никакой
                        а когда ежеквартально выпуск очередных версий 4-5 проектов (продолжающихся несколько лет), и для каждого из них клеить именно ту версию буста, с которой он зарождался (особенно если проекту года 3 уже) - вот как раз прямой путь к зоопарку
                        особенно если эти проекты начинают в определенный момент шарить общие dll между собой, чтобы не дублировать некую функциональность
                        Ответить
                        • Мы игры делаем. Не будут они между собой ничего шарить. Только "движковую" часть в статической библиотеке, которая постоянно развивается параллельно с разработкой каждой следующей игрушки.

                          Двух одновременно на одном фреймворке обычно не делаем. Точнее, попытались как-то раз, но закончилось это заморозкой одного из проектов, т.к. из-за распыления команды страдали оба (с зависимостями это никак не связано). Вот сейчас один выпустили, второй размораживаем, так что опять всё вполне самостоятельно и ничего не шарится.
                          Ответить
                    • Кстати, ещё пример - как-то раз после обновления FreeType у меня одни и те же тексты одними и теми же шрифтами стали отрисовываться по-другому. Настолько по-другому, что это заметно невооружённым глазом и проявляется, насколько помню, даже в высоте символов.

                      Не знаю, может, это был багфикс или значительное улучшение, но, думаю, многие согласятся, что подобные сюрпризы - далеко не всегда приятны.
                      Ответить
                  • >Ну вот так уж у нас принято - сторонние либы (их много), которые используются, лежат рядом с проектом.
                    Гугли возможность "внешние зависимости" своей системы контроля версий.
                    Ответить
                    • Как только пойму, зачем мне это нужно - так сразу.
                      Ответить
              • А если бы вы разрабатывали проект на Qt, то вы бы тоже всю библиотеку копировали в сурсконтрол?

                Имхо 3rd'party либы должны лежать отдельно от проекта (если вы их конечно не допиливаете).
                Ответить
                • Qt не Qt, а wxWidgets там уже валяется (для какого-то редактора кем-то использовался). И даже DirectX SDK "правильной" версии.
                  Ответить
    • "А стоило бы. В конце концов, это и жизнью-то назвать сложно. Скорее жалкое существование".
      Ответить

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