Задать вопрос
  • Есть ли аналог help() из Python3 в C++?

    Profi_GMan
    @Profi_GMan
    К сожалению нет, но и зачем? Там всё равно всё не опишешь... Подобное можно найти на сайтах, например ru.cppreference.com/w или en.cppreference.com (он часто корректнее)
    Ответ написан
    3 комментария
  • Как ловить и обрабатывать любые исключения?

    maaGames
    @maaGames
    Погроммирую программы
    catch( std::exception & e )
    {
    }
    catch(...)
    {
    }

    Только так. Указать конкретные и/или базовые классы для перехвата конкретных типов исключений и (...) для перехвата всего остального.
    На самом деле, ещё останутся структурные исключения, которые не перехватываются даже (...) и их нужно перехватывать отдельно...
    Ответ написан
    Комментировать
  • Как ловить и обрабатывать любые исключения?

    Nipheris
    @Nipheris Куратор тега C++
    В C++ с точки зрения языка у исключений нет базового класса или какого-то другого общего типа, представляющего всякое значение, летящее в исключении. Не забывайте, что выбросить вы можете, к примеру, целое число (хоть это и не рекомендуется).

    Поэтому встречный вопрос - если форма значения в исключении заранее неизвестна, как можно сделать что-либо с этим значением? Что вы хотите "распознать", когда поймали исключение? Какую операцию вы хотите выполнить?

    Вообще посмотрите на std::current_exception, но убедитесь, что оно вам подойдёт.
    Ответ написан
    8 комментариев
  • Как лучше всего выполнить задание на должность Junior QA?

    Привет.

    1) У тебя должно быть по итогу два документа: Тест-план и Тест-кейсы (табличкой). Их ты сможешь сделать, если прочитаешь базовую теорию по тестированию софта. Обычно тест-план занимает одну страничку, а тест-кейсы содержат от 5 до 10 страничек на собеседованиях.

    2) Надеюсь, ты у них спросил какие они дают тебе ограничения по тестированию игру. Так как при тестировании игры в вакууме, получается такой же "вакуумный ответ". Поэтому, хорошо бы выписать все спорные и пограничные моменты, которые у тебя есть, и уточнить их у продакта (того, кто тебя собеседует). Это любят на собеседованиях, так как если ты этого не спрашиваешь, они понимают, что ты в этом вообще ничего не шаришь.

    3) Не делать тупую ошибку - пытаться ломать игру с самого начала. Твоя задача для начала проверить, что игра работает правильно (согласно требованиям), потом проверить пограничные случаи, а только потом делать негативные тесты.
    Ответ написан
    1 комментарий
  • Является ли результат выражения UB?

    Andrey2008
    @Andrey2008
    DevRel в PVS-Studio
    Всё сложно, так как стандарт меняется.

    i = i++;  // Это было неопределённым поведением до C++17
    i = ++i;  // А это было неопределённое поведение до C++11
    p[i] = i++;  // Это было неопределённым поведением до C++17

    Ещё на эту тему см. V567.

    В общем, теперь всё ещё более запутано и фиг разберёшься. :)

    Что делать? А просто не надо писать такие конструкции. Даже если теперь они стали корректными. Они путают программиста, читающего код и заставляют задумываться. Не делайте так. И пользуйтесь анализаторам PVS-Studio. Он укажет на непроектные и плохо написанные фрагменты кода.
    Ответ написан
    1 комментарий
  • Как правильно чистить память в c++?

    @res2001
    Developer, ex-admin
    Ошибка вылетает только при компиляции в Debug, потому что в этом режиме, скорее всего, в код включаются проверки целостности кучи. Просто в release целостность кучи не проверяется, но это не значит, что ошибки нет.

    Ошибка тут:
    for (int i = 0; i <= deg; i++) newdata[i] = data[i];
    Вместо deg нужно использовать maxdeg, имхо.

    Кроме того вы не проверяете значение deg и maxdeg до выделения памяти. Что если они содержат значения <= 0?

    Возможно, есть и другие места с присваиванием массиву data и переменной deg. Нужно искать выход за границу массива при присваивании элементам массива из-за чего повреждается куча.
    Так же настораживает new int[deg +1] и операторы >= и <= в условиях циклов обхода массива, это потенциальные места выхода за границу. Возможно, если перейти от deg к количеству элементов в массиве, то код упростится (уберете +1 при выделении и = в условии циклов) и будет легче найти ошибку.

    PS: в качестве небольшой оптимизации: для обнуления массива можно использовать функцию memset, для копирования массивов - memcpy.
    Ответ написан
    1 комментарий
  • В чём причина постоянного переделывания кода?

    search
    @search
    мама говорит что я особенный
    На самом деле, рефакторинг - это неотъемлемый элемент процесса разработки. Без него никак. На поздних этапах обязательно всплывают неучтенные подробности. К тому же сам разработчик развивается и стремится улучшить то, что было написано несколькими месяцами ранее.

    Но если в рамках рефакторинга программист коммитет больше 20 файлов за раз, то есть вариант что он не видит всей картины, поэтому пилит "супергибкую архитектуру". В этом случае, можно сесть вместе с разработчиком и составить майндмеп всех элементов будущей системы и связей между ними. Это будет полезно как для разработчика, так и для менеджера проекта.
    Ответ написан
    5 комментариев
  • Как архивировать файлы c++?

    longclaps
    @longclaps
    Вообще-то можно, но раз терпение кончилось - тогда нельзя.
    Ответ написан
    Комментировать
  • 3D моделирование в GameDev. Что нужно знать?

    @Dexter_Legseto
    Junior AR C# dev & 3D hobbyist
    Если рассматривать конкретно hard-surface моделлинг, а не "общую"(generalist) специальность (а это помимо моделинга текстуринг, lighting, анимация, риггинг и т.д., это все очень варьируется на этой позиции от компании к компании), то в большинстве своём программы low-poly моделлинга(Крайне экономичное оспользование полигонажа, чтобы игровые движки могли без тормозов потянуть) это те же самые, в чём делают и CGI(рендеры и видео), где в большинстве своём high-poly (экономичный полигонаж не так важен, важна детализация). Тоесть, это те же Blender/Maya/Max и т.д.

    Если рассматривать как "3д" направление в целом(Все специализации), то чтобы иметь возможность иметь вполне завершённую работу, то следует изучить текстуринг, например в Substance Painter или в Quixel, а так же немного постобработки на базовом уровне в PS, чисто чтобы ваше портфолио выглядело хорошо. (Ну и UV unwrapping на хорошем уровне в блендере)

    Дальше уже посмотрите по специализациям, что вам интересно(hard-surface 3d artist, generalist, texture artist, character artist( это уже в основном скульптинг ), light artist(это уже ближе к движкам или рендер направлениям) , да и render artist тоже в геймдеве появляется, более технические tech artist, rigging artist, animator и т.д.) Заходите на стримы к профессиональным художникам, смотрите что они используют. Программ туча, направлений куча.
    Ответ написан
    1 комментарий
  • Как правильно собрать кроссплатформенный проект?

    MAKAPOH
    @MAKAPOH
    многостаночник
    Я в своих мелких проектах пишу примерно так (система сборки qbs):
    Group {
            name: "cpp_os_specific"
            prefix: "src/cpp/utils/"
            files: {
                if (qbs.targetOS.contains("windows"))
                    return ["utils_windows.cpp", "utils.h"];
                if (qbs.targetOS.contains("linux"))
                    return ["utils_linux.cpp", "utils.h"];
            }
        }

    Соответственно при сборке на разных платформах просто используются разные файлы, никаких разных имён классов или #if defined не нужно.
    Насколько это может быть удобно/неудобно на больших проектах не знаю.

    P.S.
    По поводу qbs, к сожалению генератора проектов из Qt Creator, нет. По крайней мере раньше не было, я давно туда не заглядывал. Но если написать файл проекта руками то он нормально открывается в Qt Creator (qbs плагин обычно включён по умолчанию).
    Пример файла сборки qbs:
    spoiler
    import qbs 1.0
    
    Product {
        type: "application"
        name: "timer_qml"
        consoleApplication: false
    
        Group {
            name: "cpp"
            prefix: "src/cpp/"
            files: ["*.cpp", "*.h"]
        }
    
        Group {
            name: "cpp_os_specific"
            prefix: "src/cpp/utils/"
            files: {
                if (qbs.targetOS.contains("windows"))
                    return ["utils_windows.cpp", "utils.h"];
                if (qbs.targetOS.contains("linux"))
                    return ["utils_linux.cpp", "utils.h"];
            }
        }
    
        Group {
            name: "resources_and_qml"
            prefix: "src/qrc/"
            files: ["*.qrc", "*.qml"]
        }
    
        Depends {
            name: "Qt"
            submodules: {
                if (qbs.targetOS.contains("windows"))
                    return ["core", "widgets", "gui", "sql", "quick", "qml"];
                if (qbs.targetOS.contains("linux"))
                    return ["core", "widgets", "gui", "sql", "quick", "qml", "x11extras"];
            }
        }
    
        Depends {
            name: "cpp"
        }
        cpp.staticLibraries: {
            if (qbs.targetOS.contains("windows"))
                return ["user32"];
            else
                return [];
        }
        cpp.cxxFlags: {
            if (qbs.toolchain.contains("gcc") || qbs.toolchain.contains("mingw"))
                return ["-std=c++11"];
            else
                return [];
        }
        cpp.dynamicLibraries: {
            if (qbs.targetOS.contains("linux"))
                return ["Xss", "X11"];
            else
                return [];
        }
    
        Group {
            name: "App itself"
            fileTagsFilter: parent.type
            qbs.install: true
            qbs.installDir: "bin"
        }
    }


    По официальной документации можно за пару вечеров освоить.
    Ответ написан
    6 комментариев
  • Где посмотреть, какие операции можно применить к определенному типу данных в C++?

    saboteur_kiev
    @saboteur_kiev Куратор тега C++
    software engineer
    Это legacy наследние, которое сейчас считается устаревшим.
    Когда трава была зеленее, а С++ еще слишком молод, в чистом С вообще не было boolean, поэтому использовался int, который использовался в качестве flag переменных.
    При этом 0+1 = true, 1+1 = true, 2+1 = true (все верно)
    Но при этом 1-0=false (верно), однако 2-1=true, 3-1=true.

    Поэтому никогда никто не использовал декремент для подобных значений - иначе это могло привести к ошибке. Собственно инкремент тоже теоретически мог однажды переполниться...

    Когда появился boolean, то для совместимости сохранили возможность инкремента boolean, но с самого начала это считалось deprecated.

    The value obtained by applying a postfix ++ is the value that the operand had before applying the operator. [Note: the value obtained is a copy of the original value ] The operand shall be a modifiable lvalue. The type of the operand shall be an arithmetic type or a pointer to a complete object type. After the result is noted, the value of the object is modified by adding 1 to it, unless the object is of type bool, in which case it is set to true. [Note: this use is deprecated, see annex D. ]


    Кстати это в 2015 году уже официально отменили:
    www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p...
    "The ++ operator for bool was deprecated in the original 1998 C++ standard, and it is past time to formally remove it.
    Ответ написан
    Комментировать
  • Нету вывода из массива с указателями из структуры с++?

    @Mercury13
    Программист на «си с крестами» и не только
    Первое и главное. Удивительно, что у вас программа заработала, ведь text.sentences не инициализировано. У меня вылет.

    Ну и извечная ошибка начинающего «плюсовика»: память выделяется, непонятно, кто чем владеет, и, разумеется, память «течёт». Для чего, извините, в Си++ сделали инкапсуляцию, конструкторы и деструкторы?
    Ответ написан
    Комментировать
  • Какие предметы желательно освоить программисту без технической "вышки"?

    egor_nullptr
    @egor_nullptr
    Дискретная математика, Теория автоматов, Математическая логика, Теория вероятностей и математическая статистика, Теория алгоритмов, Моделирование, Защита компьютерной информации, Микропроцессорные системы, Сети ЭВМ, Операционные системы, Базы данных.
    Ответ написан
    9 комментариев
  • Какое время жизни объекта в std::unique_ptr?

    terrier
    @terrier
    Хотите еще более клевую штуку покажу?
    int main(int argc, char *argv[])
    {
        ttt *t = new ttt();
        t->foo();
        delete t;
    
        t->foo();
    
        return 0;
    }

    Выводит
    Alive 0x55d7770d0c20
    Removing
    Alive 0x55d7770d0c20
    ( собирал чем попало ).
    При вызове деструктора для объекта никто не обязан как-то его "разрушать", скажем занулять область памяти, где он лежал. Это просто договоренность с программистом, что объект удален и обращаться к нему не надо. Что будет если обратиться? Undefined behaviour, частный случай которого мы с вами и наблюдаем.
    Ответ написан
    Комментировать
  • Почему на тостере вопрос должен обязательно заканчиваться вопросительным знаком?

    Потому что это сервис вопросов и ответов.

    Если человек не может сформулировать заголовок вопроса в виде вопроса, скорее всего, он либо задаёт не вопрос, либо недостаточно хорошо продумал, что именно хочет спросить.

    Все "перлы", которые вы привели, легко переформулировать в настоящие вопросы. То, что авторы этого не сделали, показывает уровень их уважения к тем, кто будет в этих вопросах отвечать.
    Ответ написан
    1 комментарий
  • Где как и когда применять многочлены?

    longclaps
    @longclaps
    Я не уверен, что понимаю, что значит "решать многочлены" (упрощать их, что ли?). Тем не менее:
    Представь, что тебе нужно соединить гладкой кривой несколько точек. Зачем? Для красоты, чтобы не ломаной ) Вот точки в формате (x,y): (0,0),(1,1),(2,0),(3,1), вот решение. Это - одно из бесконечного множества решений, среди прочих оно выделяется тем, что это - многочлен минимальной степени, удовлетворяющий условию. Это очень хорошо - умножать и складывать процесор может гораздо быстрее, чем вычислять, скажем, синусы, и, значит, можно очень быстро вычислить высоту точки на кривой при любом X.
    Ответ написан
    Комментировать
  • Зачем использовать бессмысленные сеттеры/геттеры?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Когда вам потребуется добавить в сеттер валидацию, а в геттер - кэширование, то не придется менять вызовы в клиентском коде. К тому же, аксессоры можно делать виртуальными.

    IDE прекрасно генерирует такой код, равно как и он сам легко оборачивается в макрос. Многие компиляторы так же имеют языковые расширения, позволяющие реализовать properties в C++.
    Ответ написан
    Комментировать
  • Где взять практику программисту?

    @younghacker
    А вы уверены что вы программист?
    У меня идеи были раньше навыков программирования и раньше знания языков.
    Что программировать даже вопросов не возникало.
    Придумывал задачу и писал. Сталкивался с проблемой - брал
    дизассемблер, отладчик и смотрел как это решают другие.
    Читал исходники чужих широко известных библиотек.
    Красивый, понятный, изящный код. Это же кайф, как поэзия!

    Практику можно только напрактиковать! :)
    Тренировка во сне - пока что возможна только в кинематографе.
    Ответ написан
    2 комментария