• Список умений и тем в gamedev?

    GavriKos
    @GavriKos Куратор тега Разработка игр
    Открываете вакансии и читаете.
    Ответ написан
    Комментировать
  • Почему родительский проект в гит отслеживает изменения в подмодулях?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Собственно, это нормально и правильно - вы же поменяли сабмодуль? Поменяли.

    Следовательно, родительский проект теперь, фактически, использует другую версию сабмодуля.

    Следовательно, сабмодуль нужно закоммитить и обновить ссылку у родителя (и тоже закоммитить).
    Ответ написан
    2 комментария
  • Как решить проблему с исключением в моем коде?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Ошибка в недрах стандартной библиотеки. Вы в вашей программе что-то не так делаете и она падает. Это частая проблема в C/C++, можно допустить такие ошибки, что программа упадет.

    Вы уже открыли вашу программу в дебаггере. В правом нижнем углу вы видите стек. Первые 3 функции - это в недрах библиотеки. Вам тут ничего не понятно, поднимайтесь вверх. Ткните в четвертую строчку - там где Main().

    Увидите, что ошибка происходит на строчке:
    cout << morze.find( text[i] )->second <<" ";

    Проблема возникает при попытке обратиться к second у возвращенного значения. Но почему? Читайте ошибку: "cannot dereference end map/set iterator".

    Т.е. find возвращает end() итератор. Действительно, посмотрите в документацию - map вернет end() если искомого ключа в нем нет.

    Иправить ошибку просто - исправьте ваш код. Сначала присвойте переменной возвращенный из find итератор, и потом проверяйте, а не end() ли он. И только в противном случае выводите.

    Я подозреваю, что символом оказался пробел. Пробела в вашем мапе morze нет, вот все и падает.
    Ответ написан
    1 комментарий
  • Как решить проблему с исключением в моем коде?

    Adamos
    @Adamos
    Читаем документацию: что возвращает std::map.find(). И что - может вернуть.
    Ответ написан
    Комментировать
  • Что не так с моим резюме?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Не знаю как сейчас дела с Android, но среди spring'овых разработчиков, ищущих первое рабочее место, конкурс примерно двести человек на одно место. Так что 15 компаний и один месяц - это мелочи.
    Ответ написан
    24 комментария
  • С чего начать в 30 лет?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Фундаментальная проблема - в игрострой стоит очередь фанатов с горящими глазами. Людей, которые пишут игры, играют в игры, моддят игры, хакают игры..., начиная с возраста, когда они смогли дотянуться до клавиатуры (как ваш покорный слуга). При этом, у них столько мотивации, что они могут сами поставить себе задачу, сами нагуглить все, что нужно (Спасибо дяде Немнюгину за его учебник. Это все что нужно знать о DOS, чтобы закодить dOOm) и сами все напишут и нарисуют (работая над этим сутками. Не потому что над душей стоит босс с воплями о лишении премии, а потому что им это интересно).

    И вот теперь, Андрей, который уже устал хочет встать в очередь высоко мотивированных конкурентов и попросить себе оффер. Каковы его шансы на успех?

    В играх есть много специализаций программирования - хотите графику, придется учить одно (причем на 2d и 3d это одно будет разное), хотите игровую логику и скриптинг - это номер два, хотите системную часть и бэкенд - это будет третье.

    Для универсального развития, нужно начинать с простых фиговин вроде тетриса, арканоида, бильярда и прочего (в которых однако есть все столпы игростроя - графика + логика + системный движок, можно и добавить сеть, если подумать) и потом наращивать сложность - делать платформер или RTS.
    Ответ написан
    4 комментария
  • Какие сервера для игры на Unity лучше?

    @rPman
    Если 'разработать игру' - это использовать готовый конструктор, который предоставляет и клиент и сервер, и тебе этого функционала достаточно - то само собой делать свой сервер в такой ситуации неоправданные затраты.

    Если логика твоей игры не типовая, то лучше писать свое.

    p.s. игровой сервер создать часто бывает проще игры, а если есть возможность переиспользования кода (используется тот же язык программирования и фреймворк) то часть даже не придется переписывать, а можно будет взять из клиента (например та часть что отвечает за валидацию и защиту от читерства), но чаще и этого не делают.
    Ответ написан
    Комментировать
  • Почему мой код приводит к ошибке?

    vabka
    @vabka
    Токсичный шарпист
    А куда scanf должна помещать считанные данные? Передай в неё какую-нибудь переменную, с которой она будет работать.
    Что-то типа такого:
    #include <stdio.h>
    
    int main ()
    {
      char str[255];
      for (int i = 0; i < 3; i++)
        {
          scanf ("%s", str);
        }
      printf ("%s", str); // Выведет последнюю введённую строку
      return 0;
    }
    Ответ написан
    6 комментариев
  • Как построить блок схему?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Спросите у перподавателя.

    Может вместо конструкций C++ типа cin, cout, printf надо использовать псевдокод. Типа "ввод x"
    Ответ написан
    5 комментариев
  • Как получить элементы структуры?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Придется именно лазить туда и смотреть исходиник.

    Можно облегчить себе жизнь и использовать IDE. Тогда после написания "car_1." любая достаточно хорошая IDE подскажет вам список всех членов этой структуры. Но это по сути просто автоматизация действия "посмотреть в исходник".
    Ответ написан
    Комментировать
  • Можно ли в C++ перезагрузить оператор уже существующего класса?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    В описанном вами случае - можно, написав внешнюю функцию суммирования.
    std::vector<int> operator + (std::vector<int> a, const  std::vector<int>& b)
    {
        if(a.size()!=b.size())
        {
            throw std::range_error("sizes mismatch!");
        }
        for(size_t i=0;i!=a.size();++i)
        {
             a[i]+=b[i];
        } 
        return a;
    }
    Ответ написан
  • Сработает ли деструктор, присвоив atomic?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Не совсем понятно, а чего вы вообще пытаетесь добиться зануляя value? После деструктора весь объект и его член value уничтожаются. Любое обращение к ним - это UB. Соотвтественно вы этот новый 0 никак снаружи пощупать не сможете.

    Теоретически компилятор мог бы понять, что эта инструкция не может иметь никаких эффектов и удалить ее нафиг. Но даже если он этого не сделает - как это должно проверять на висящие указатели, я не понимаю.

    Единственный способ бороться с этим, кажется, это использовать умные указатели. Всякие WeakPtr, которые не уничтожают блок счетчиков при удалении объекта. Если же вы опустились до сырых указателей, то это тупо адрес (число). И просто по нему никак не понять, а что по этому адресу лежит - оригинальный объект или что-то левое.
    Ответ написан
  • Будет ли большой std::vector быстрее, чем std::vectorstd::vector?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Да. Потому что локальность памяти и меньше разыменовываний.

    в vector<vector> это фактически указатель на массив указателей. Строки раскиданны по памяти как попало и при обращении к ячейке будет лишнее обращение к памяти, чтобы получить адрес строки.

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

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    wt_fxhxvwnjp6luyqrftbwdcgy4.png

    graphviz и все что у него в комплекте (dot, neato и др)
    Ответ написан
    2 комментария
  • Задача на codeforces на проходит по времени?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    У вас решение за O(NM), когда как есть решение за O(N+M).

    Вы считаете сумму всех цен каждый раз. Но это делать не обязательно, ведь вам надо найти сумму всех цен, кроме одной. Можно подсчитать сумму всех один раз и потом вычитать из нее лишнюю цену (но надо аккуратно подумать о переполнениях). Или можно воспользоватся префиксными и постфиксными суммами.
    Ответ написан
    2 комментария
  • Является ли хорошим решением разбивать большой класс на несколько .cpp файлов (C++)?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Это очень плохая идея. Теперь пользователю придется искать функцию в 5 файлах, потому что она может быть в любом из них. Если же куски класса можно как-то логически сгруппировать, то надо разбить сам класс на несколько более мелких. Вынести часть функционала в вспомогательные классы или даже тупо функции.

    Большой файл - гораздо менее вредно, чем нелогичная файловая структура проекта. Вот большие функции и класс с излишне большой ответственностью - это плохо. А файл - фигня. Строк от разбивки меньше не становится. Ну придется еще переключатся между файлами - только хуже станет.
    Ответ написан
    Комментировать
  • Зачем в стандартной библиотеке вначале класса объявлены псевдонимы для параметров шаблона?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Это делается по нескольким причинам.

    Во-первых, чтобы можно было к параметру шаблона обращатся в других шаблонах. Вот, вы привели пример с _Сontainer в каком-то итераторе. Можно представить что есть какой-то алгоритм (функция), который принимает итератор и ему там надо будет как-то использовать тип контейнера (или временную переменную завести, или тип возвращаемого значения задать или как-то проверить, что тип контейнера обладает какими-то свойствами).

    При этом алгоритм должен получать и вот этот вот back_insert_iterator и еще десяток других итераторов. Поэтому нельзя тип контейнера вынести в параметр шаблона и указывать его в типе итератора в праметре функции. Вы поищите в исходниках этот самый "_Container" - станет понятно, как оно используется.

    Во-вторых, иногда это делается и для удобства. Ибо в этих шаблонах параметры сами могут быть адски нагроможденными шаблонами.
    Ответ написан
    Комментировать
  • Как сравнить 2 класса с разными шаблонными параметрами?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    А не проще ли так?
    template <const std::size_t other_columns>
     Matrix<rows, other_columns, T> MultiplyOnMatrix(const Matrix<columns, other_columns, T>& matrix)
    Ответ написан
    1 комментарий
  • Как "забыть" переменную на c/c++?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега C
    Седой и строгий
    Переменные прекращают существование после завершения блока, в котором объявлены. Соответственно, используйте маленькие функции, объявляйте переменные как можно ближе к месту их использования и компилятор обо всём позаботится сам.
    Ответ написан
    Комментировать
  • Почему можно обратиться к объекту через указатель со значением nullptr?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Метод класса под капотом - это функция, котрой помимо прописанных параметров передается указатель на объект. В вашем случае передается nullptr. Но сама функция не обращается к объекту, да у него и членов-то с данными никаких нет. Поэтому все более менее работает. Но это UB и могло и не повезти. Из-за оптимизаций компилятор мог бы что-то сломать.

    P.s. сказанное выше не относится к виртуальным функциям. Там указатель на функцию храниться в vtable в экземпляре класса и вызов через nullptr скорее всего упадет.
    Ответ написан
    Комментировать