Ответы пользователя по тегу C++
  • Как реализовать сумму дробей?

    arusef
    @arusef
    Novice .NET dev
    Общая схема примерно такая:
    (I)nput := [x0, y0, x1, y1, x2, y2 ... xn, yn]
    
    (R)ational := (a, b)
    Trunc(R) := R(a / НОД(a,b), b / НОД(a,b))
    R1 + R2 := Trunc(a1*b2 + a2*b1, b1*b2)
    R1 + R2 + R3 := (R1 + R2) + R3
    
    Output := R(I[0],I[1]) + R(I[2],I[3]) + ... + R(I[2n-1],I[2n])
    Ответ написан
  • Можно ли сэкономить память при копипасте?

    arusef
    @arusef
    Novice .NET dev
    В общем случае эта задача не решаема из-за различия контекстов исполнения.
    Чтобы добиться схожего эффекта, люди и придумали функции ведь. Думаю, что вы знаете, что функция - в сущности, инструкция call, которая обвешена дополнительным кодом для организации изолированного контекста. Если вам это поведение не нужно, то почему бы не использовать обычные инструкции jmp/call и писать в goto-стиле? Тогда отдельные участки кода будут полагаться на определённые предположения о контексте и переиспользоваться, в зависимости от оного. Но учтите, что такой подход крайне сложен и является источником большого числа ошибок.
    Ответ написан
  • Какой уровень математики нужен в GameDev (Unity, UE4)?

    arusef
    @arusef
    Novice .NET dev
    AAA-проекты не пишут математики. Вам нужно знание sdk и умение программировать. А подкруткой физики, освещением, моделями и прочим займётся команда специальных людей в этом проекте. Равно как и сценарием, локациями, звуком... вплоть до того, что затюнят движок под нужды проекта.
    Но всё же, если отвечать по существу: в этих движках 99% физики уже реализовано и вам математику не нужно знать вообще. Ну разве что на уровне понимания координат/векторов и всякого такого. Если нужно что-то сверх того, то вам необходимо знать математику очень хорошо. И не просто, а с умением разбираться или составлять нужные алгоритмы для машины.
    Ответ написан
    1 комментарий
  • Скажите, эта паста верна? Если нет, то почему?

    arusef
    @arusef
    Novice .NET dev
    В данном случае запрашиваемая вами "истинность" неприменима. Это всего лишь его мнение по поводу использования такого инструмента, как С++, причем в весьма узком смысле: он пишет дрова и софт для embedded. То есть, если это "С с классами", то зачем ему вообще нужен С++? Очевидно же, что от ООП и стандартной библиотеки там, где он работает, практически ничего нет.
    Но теперь по существу. Уровни доступа - чисто ООПшная штука для облегчения жизни, и используя нормальные объекты С++ в сыром виде всегда есть большой риск выстрелить себе в ногу. С одной стороны, потому что private члены, по логике, лучше не трогать снаружи, а с другой - зачем использовать смещения, когда компилятор всё это и так делает за нас в виде обычных полей? Ещё раз: уровни доступа защищают код не от злоумышленников, а от нас самих.
    В общем, печально, что есть такие "специалисты" в 2017.
    Ответ написан
    1 комментарий
  • Почему лучше передавать данные через параметры функции, а не работать с ними глобально?

    arusef
    @arusef
    Novice .NET dev
    Потому что использование параметров обеспечивает чистоту функций, а значит и повышает модульность программы, переиспользуемость, и в некоторых случаях даже распараллеливание.
    Ответ написан
    Комментировать
  • С++ Классы, нужно сравнить два объекта одного класса и вывести результат на экран, как это сделать?

    arusef
    @arusef
    Novice .NET dev
    Эх. Вообще, знать длину окружности или площадь для сравнения не нужно. Достаточно знать, что у окружностей радиусы одинаковые.
    А посему, есть пара советов (и пускай это пока не будет true C++)
    1. Делать методы get_XXXX типа void - очень странный подход. Мало того, что класс такой специфики едва ли должен знать о логике вывода в консоль, так ещё и это нарушает в принципе семантику get. Поэтому из таких методов лучше возвращать просто значение соответствующего поля.
    2. Чтобы добавить какую-то логику сравнения, можете добавить такой или аналогичный метод:
    public: bool equals_to(const Circles& right){
        return rad == right.rad; // обычно сравнивать float так не очень хорошо, но пусть будет
    }
    Ответ написан
    1 комментарий
  • Как перейти с Unity на Ue4?

    arusef
    @arusef
    Novice .NET dev
    1. Почитайте Страуструпа, например.
    Полезная инфа
    Ссылка гуглится за 5 секунд. https://tproger.ru/books/cpp-books-definitive-guide/

    2. Изучите STL.
    3. Читайте документацию.

    И помните, что С++ довольно сильно отличается от управляемых языков, типа C#. Разработчики UE, конечно, постарались сделать всё, чтобы было меньше геморра (взять те же Blueprints), но всё же. Так что учите модель работы с памятью, учите синтаксис, учите библиотеку, и всё у вас будет хорошо.
    Алсо, UE на первых порах слабо отличается от Unity, так что вам будет легче.
    Ответ написан
    Комментировать
  • MPI: Как оповестить процесс о новых сообщениях?

    arusef
    @arusef
    Novice .NET dev
    Можно просто захватывать мьютекс на время выполнения приёма данных. Однако, исходя из здравого смысла, ваша "многопоточность" будет сводиться к тому, что потоки станут работать поочерёдно. Можно использовать только один поток, т.к. MPI в принципе подразумевает выделение процессов под количество вычисляющих ядер в системе и наличие второго потока будет лишь притормаживать работу. В таком случае, ваш процесс может принимать данные о задаче в неблокирующей манере в какой-нибудь буфер, где после выполнения задачи будет проводиться проверка на наличие новых задач.
    Ответ написан
    Комментировать
  • Как удалить элемент из класса в С++?

    arusef
    @arusef
    Novice .NET dev
    Не существует перегрузки оператора "<<" для ostream такой, чтобы она принимала class tv в качестве параметра. Попробуй определить метод toString() в классе tv, который будет выводить на экран то, что тебе нужно.
    К тому же, в классе tv у тебя не перегружен оператор "=", поэтому присваивание идёт поверхностное. Не помню, как там со статическими массивами, но, скорее всего, они просто начинают ссылаться на другую область памяти (то есть на строки в соседнем элементе). Следовательно, если у тебя не были инициализированы чем-то элементы старше count, то всё заполнится мусором.
    Ещё один момент заключается в том, что массив на самом деле не сжимается, это ты двигаешь элементы справа налево, оставляя в конце один неиспользуемый. Обычно в таких случаях выделяют память под новый массив меньшего размера, а потом переносят всё в него, например.
    Ответ написан