• Каков сценарий использования git для одного разработчика?

    gobananas
    @gobananas
    finishhim.ru
    Делаете ветку master, ветку dev и отдельные ветки под отдельные фичи.
    Делаете 2 сайта - один сам проект (основной) - на него выкатываете master, второй сайт тестовый - на него выкатываете ветку dev. Остальные ветки разрабатываете, сливаете с dev выкатываете на тест, если там всё нормально то dev сливаете с мастером. За ноут просто когда садитесь если мастер новый есть делаете git pull и стягиваете новую версию
    Ответ написан
    11 комментариев
  • В чем различие между объявлением с new и без него?

    @Mercury13
    Программист на «си с крестами» и не только
    ПОЛОЖЕНИЕ В ПАМЯТИ
    Без new: static/глобальная — в сегменте данных, локальная — на стеке. В сегменте данных память отводится при компиляции линковке, создать стековый фрейм — две команды процессора.
    С new: в куче. Управление кучей — довольно сложная задача, и если этих new много, программа может начать тормозить.

    ВРЕМЯ ЖИЗНИ
    Без new: объект живёт, пока выполнение находится в данном блоке. При выходе из блока автоматически срабатывает деструктор.
    С new: уничтожаем, когда хотим.

    ИМЕНОВАНИЕ
    Без new: объект привязан к своему имени.
    С new: объект безымянный (имя только у указателя). Потому возможны структуры данных переменного размера: динамические массивы, связанные списки, деревья и прочее.

    РАЗМЕР
    Без new: задан при компиляции. То есть массив на 10 позиций, и точка, больше — только перекомпиляцией.
    С new: произвольный.
    Ответ написан
    Комментировать
  • Какую графическую библиотеку стоит выбрать для C++/C#?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Оба подходят. А библиотек под C++ десятки, если не сотни. Использовать стоит те, которые больше подходят для конкретного приложения или более удобны вам.
    Ответ написан
    2 комментария
  • Какая проблема при выполнении цикла?

    @res2001
    Developer, ex-admin
    Вот здесь:
    a[dd + 1]
    выход за границы массива на последней итерации цикла.
    Ответ написан
  • Синхронизация автомобиля в игре?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Можно сделать через проверку физики ближайших автомобилей самим клиентом.
    И если есть отклонение (чит) - сообщать серверу.
    Если такое сообщение придёт сразу от нескольких клиентов относительно какого-то одного - это указывает на возможный чит и нужно дополнительно проверить это на сервере для наиболее точного подтверждения факта обмана.
    Однако, при отсутствии ближайших автомобилей, нужно скорость перемещения (длину вектора смещения и время, и другие параметры) контролировать исключительно на сервере.

    заспавнит автомобиль именно в том месте, где он был изначально
    ну так нужен тайм-аут по которому объект убирается из игрового мира.
    Ответ написан
    Комментировать
  • Синхронизация автомобиля в игре?

    Stalker_RED
    @Stalker_RED
    а сервер будет думать
    серверу не нужно думать, он должен знать. Клиент сдвинул автомобиль - обязательно должен сообщить серверу. Более того, сервер должен еще и проверять что там куда сдвинули. А вдруг это читеры, хотят сдвинуть автомобиль сквозь стену, или слишком быстро двигают, или вообще решили вместо автомобиля сдвинуть соседний пивзавод.
    Ответ написан
    2 комментария
  • Есть ли аналог 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 не инициализировано. У меня вылет.

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