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

    +46

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    extern QString code2text(unsigned long code)
    {
        if (code == 0) return QString::fromUtf8("Операция успешно завершена");
        if (code == 1) return QString::fromUtf8("Неверная функция");
        //over 3400 строк
        return QString("%1").arg(code);
    }

    как это сделать по человечески?
    полная версия https://github.com/kin63camapa/softodrom/blob/master/softodrom/errcodes.cpp

    Запостил: kin63camapa, 07 Января 2015

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

    • чем массив с простой статической инициализацией не устраивает?

      и еще один массив для кэширования QString'ов?
      Ответить
      • не совсем понял а массивы что дадут? Суть в другом функция возвращает текст ошибки по номеру кода. Соответсвенно не хочется все это компилить в тело программы но и дергать например из внешнего файла в случае ошибки идея так себе. Код кстати берется из виндового getLastError мож есть какие-нить апи для его резольвинга в текст?
        Ответить
        • http://wm-help.net/books-online/book/59464/59464-2.html#head1top2
          Ответить
          • или http://msdn.microsoft.com/en-us/library/windows/desktop/ms680582%28v=vs.85%29.aspx

            и массивов не знают, и доку найти не могут.

            http://imgur.com/gallery/NRgQUrx
            Ответить
            • в голову не могло прийти что FormatMessage это искомая функция я её видел в msdn в описании GetLastError перешел по ссылке, прочитал FormatMessage function Formats a message string. Закрыл вкладку.

              зы массивы знаю, притом считаю что хорошо.
              Ответить
            • Да ладно, ерунда :) Если исключить FormatMessage, то объявлять массив из 3.4*10^3 строк - то ещё удовольствие. Да и кешировать КуСтроки тоже особо незачем. Ну будет окошко с текстом ошибки на микросекунду быстрее создаваться, глобального потепления этим всё равно не предотвратить. У свитча тут есть небольшое преимущество Holy shit, только что заметил, что это не свитч!
              Ответить
            • +100500
              Ответить
        • > не совсем понял а массивы что дадут?

          детский сад, какой-то.

          пихаешь все литералы в массив. массив индексируется уже существующим кодом.

          берешь по коду нужную строку из массива и передаешь ее параметром QString::fromUtf8().

          что бы зазря постоянно не конвертить литералы в QString'и, заводишь еще один массив указателей на QString'и и пользуешься им как кэшем: если указатель не нул, то возвращаешь копию уже существующего QString'а. иначе создаешь новый QString сохраняешь, его в кэше.
          Ответить
          • нифига не понял вы предлагаетет просто все эти строки в массив закинуть и по индексу дергать их там 3,5 тысячи? оператива безразмерная что лэ?
            Ответить
            • > оператива безразмерная что лэ?
              Ну, предположим, что кодов ошибок не 3500, а около 16000. Пусть описание каждой занимает 500 байт, это около 8 мегабайт дискового пространства, которые могут даже не быть загружены в оперативную память при запуске приложения. 8 мегабайт - это много или мало? Учитывая то, что ты уже пользуешься Qt, это - пшик, просто посмотри, сколько весят QtCore + QtGui + QtWidgets и не забудь к этому прибавить двойную буферизацию окошек.
              Ответить
              • ну а зачем искуственно раздувать прогу там где это не нужно, особенно с учетом того что запускаться оно будет начиная с W2k на машинах с очень ограниченными ресурсами
                Ответить
            • > оператива безразмерная что лэ
              А твой свич где хранит строки? :) В той самой оперативе.
              Ответить
              • Как верно заметил господин Dummy00001 нормальная ос полностью экзешник в оперу не закидывают, НО специфика программы такая что образ и так почти всегда буде висеть в опере (ибо работать будет по самбе а винда имеет привычку сначала вычитывать экзешник с шары полностью какой бы он по размеру не был) следовательно если всё это запихнуть в массив то висеть в опере эта инфа будет уже дважды 1 раз в образе второй раз в стеке
                Ответить
                • А ты пихай в массивы из const char *, а не из QString'ов, тогда висеть будет ровно один раз. Всё лучше, чем свич.
                  Ответить
            • > оператива безразмерная что лэ?

              но жесткие диски - да.

              уже как 3 десятилетия, на всех системах с виртуальной памятью, экзешники никогда полностью в память не грузятся. грузятся постранично, по первому обращению.
              Ответить
    • мурси, искомый апи - FormatMessage - хз тока чому я его нагуглить не смог :(
      Ответить
      • тока цука не работает нихера на русском, пишет нет нужного MUI-я (какова фига его нет я хз) но это уже другая история.
        Ответить
        • а припередаче NULL возвращает на английском цуко на русской винде НЕНАВИЖУ WINAPI
          Ответить
          • > НЕНАВИЖУ WINAPI
            http://youtu.be/cuAbBcM6q60
            Ответить
          • а вы уверены что у вас русская винда?

            http://stackoverflow.com/questions/12715646/how-to-use-formatmessage-c-for-getting-english-only-messages
            Ответить
          • Не будь трусом.
            Ответить
          • Пользуясь случаем могу посоветовать Учебный Алгоритмический Язык (https://ru.wikipedia.org/wiki/Учебный_алгоритмический_язык). Там ни строчки по-английски нет, представляете?! [ /color]
            Ответить
            • Дык он, наверное, пользователю показывает. А юзер не обязан знать английский...
              Ответить
              • Ну, судя по коду и репликам про оперативку - УАЯ ему все-таки не помешает.
                Ответить
            • Кстати, а он разве назывался не "школьный алгоритмический"?
              Ответить
    • https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/_qt_5_3_1_patch/qtbase/src/network/socket/qnativesocketengine_win.cpp
      Ответить
    • if (code == 13874) return QString::fromUtf8("Недоп�

      Видимо автора таки настигла рука возмездия
      Ответить
      • https://github.com/kin63camapa/softodrom/blob/master/softodrom/errcodes.cpp#L3223
        Ответить
    • Перед этой функцией явно не хватает inline.
      Ответить

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