Задать вопрос
  • В чем ошибка, если с кодом все нормально?

    @MarkusD Куратор тега C++
    reversedebil, и зачем мне список заголовков, когда я попросил привести настройки линкера?
  • В чем ошибка, если с кодом все нормально?

    @MarkusD Куратор тега C++
    reversedebil , приведи настройки линкера в своем проекте. Конкретно - список библиотек, с которыми линкуется твой проект.
  • Как сделать разрушаемость?

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

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

    @MarkusD Куратор тега C++
    sanek2005,
    всмысле безотносительно?

    Просто иногда люди не любят когда их решения комментируют без их спроса. Поэтому я написал "безотносительно".

    Да, по коду есть вопросы. В коде есть проблемы.
    map<string, unsigned int>
    std::map работает с динамической памятью. Твой код уже на этом этапе рискует провалиться в рекурсию. Чтобы это сучилось, тебе будет достаточно перегрузить глобальный new и внутри перегрузки попробовать использовать мониторинг памяти.
    Первым параметром указана строка и это не хорошо. Сравнение строк - это сравнение данных по каждому байту. Это очень медленно если мы говорим о мониторинге памяти. Логарифмическая трудоемкость std::map при доступе к элементам только усложняет весь этот процесс.
    Т.к. ты пользуешься, как минимум, C++11, тебе стоит заменить std::map на std::unordered_map, которая реализует хэш-таблицу для хранения элементов.

    MemoryMonitor()
    {
    	allocaledMemorySize = 0;
    	AllocationCount = 0;
    }

    Ты пользуешься, как минимум, стандартом C++11, который позволяет инициализировать поля по месту определения.
    Но еще до C++11 поля лучше было инициализировать через секцию инициализации конструктора.
    Сегодня поля в теле конструктора инициализировать практически незачем. А определение конструктора лишь с целью инициализации полей сегодня и вовсе бессмысленно. Есть значительно более удобные механизмы.

    MemoryMonitor memoryMonitor;
    
    template<typename T, typename... Args>
    T* Malloc(Args&&... args)

    В этом месте есть очень большой риск обратиться к неинициализированному memoryMonitor в тот момент, когда произойдет попытка вызвать Malloc до входа в главную функцию программы.
    Это называется - Static Initialization Order Fiasco.

    string typeName = typeid(T).name();
    std::string является еще одним потребителем динамической памяти. В этом месте ты добавляешь очень много накладных расходов на одну простую аллокацию памяти. Буквально, из одной аллокации ты делаешь, как минимум, три, а то и больше аллокаций. Этот момент катастрофически замедлит твой код.
    К тому же, std::string тут тебе не нужен, т.к. typeid(T).name() возвращает статически определенную строку, адрес которой будет одинаковым.
    Но и эта строка тебе, в идеале, тоже не нужна, т.к. type_info умеет возвращать хэш этой строки. Хэш будет тоже предрассчитанный. В результате тебе и map<string, unsigned int> тоже не больно нужен. Лучше ключ в карте заменить со строки на хэш. А при использовании std::unordered_map этот хэш будет использовать как есть и лишних вычислений не будет.

    auto it = memoryMonitor.AllocatedTypes.find(typeName);
    
    if (it == memoryMonitor.AllocatedTypes.end())
    {
    	memoryMonitor.AllocatedTypes.emplace(typeName, 1);
    }
    else
    {
    	it->second++;
    }

    альтернатива:
    memoryMonitor.AllocatedTypes[ typeName ]++;
    Давай заглянем в документацию, там пишется, что this function was specified to require mapped_type to be DefaultInsertable. Иными словами, внутри оператора при создании нового элемента для значения будет произведена явная инициализация по умолчанию, которая для тривиальных типов сводится к инициализации нулем.

    И напоследок.
    void MakeReport()
    При наличии этой функции это точно будет монитор памяти? Она лишняя и должна быть реализована через внешнюю относительно монитора сущность. Если завтра тебе потребуется выгрузить статистику не в файл, а передать по сети, ты сюда рядом еще одну функцию напишешь? Если да, то зачем об этой новой функции знать всем пользователям монитора?
    Пусть каждый тип данных у тебя решает ровно одну конкретную задачу. Хранение статистики - одна задача. Сбор этой статистики - другая задача. Выгрузка отчетов - третья задача. Пусть это все будут разные типы - разные сущности.
  • Возможно ли сделать шаблонную функцию дружественной классу?

    @MarkusD Куратор тега C++
    sanek2005, безотносительно качества этого кода текущий ответ является решением.
  • Возможно ли сделать шаблонную функцию дружественной классу?

    @MarkusD Куратор тега C++
    sanek2005 , дружественность - это не всегда правильно и не всегда оправданно.
    Тебе нужно предоставить примеры. Объявить шаблон другом - легко. Только если сделать это в лоб, то тогда дружественными будут все инстанцированные из шаблона функции. Я не думаю что тебе нужно именно это.
    Поэтому сперва покажи код, на его базе можно будет дать тебе более точные рекомендации.

    можно ли сделать шаблонные функции членами класса - не знаю

    Знания не берутся из воздуха, знания берутся из источников знаний.
    Какие причины ты видишь в том чтобы запретить определение шаблонов методов или статических функций в пространстве классов?
  • QT C++ Почему код так отличается?

    @MarkusD Куратор тега C++
    Adamos, первое что нашлось по памяти. :)
    Ссылка на изображение прямо с ее блога.
  • Как построить зависимость от громкости?

    feifoveir, ну давай подумаем. Не подскажешь, в чем измеряется громкость?
  • Как построить зависимость от громкости?

    feifoveir, тебе нужно что-нибудь сделать с формулировкой своего вопроса. Сейчас твой вопрос понять невозможно.
  • Какие существуют средства для работы с документами Word.docs (.doc) через c++?

    @MarkusD Куратор тега C++
    darkoment, а, ясно.
    Помимо всего вышеперечисленного могу еще предложить заглянуть в исходники Open Office. Там должен быть уже готовый код для работы с необходимыми тебе форматами файлов.
  • Как исправить ошибку в коде С++?

    @MarkusD Куратор тега C++
    1HAWK1 , а почему std::gets [?] должна присутствовать в твоей стандартной библиотеке?
  • Почему не вызвался конструктор копирования и деструктор?

    @MarkusD Куратор тега C++
    klajowski, ты сейчас волен сам написать ответ на вопрос и отметить его решением. :)
  • Почему не вызвался конструктор копирования и деструктор?

    @MarkusD Куратор тега C++
    klajowski,
    конструктор копирования должен вызываться при копирующей инициализации

    Крайне спорное утверждение. Я, согласно стандарту, вижу тут только один конструктор преобразования.
    В деталях там действительно присутствует Value Initialization [?] и Copy Initialization [?], но Copy Elision [?] этот код всегда и строго оптимизирует до ровно одного Value Initialization.
  • Почему не вызвался конструктор копирования и деструктор?

    @MarkusD Куратор тега C++
    klajowski, тогда у тебя точно нет оснований требовать вызвать конструктор копирования в месте получения результата от fillArray. :)
    У тебя там работает NRVO, если коротко.
    Обозначенным конструктором преобразования конструируется a прямо из main, после чего код fillArray выполняет ряд описанных в нем присвоений.
    return в fillArray становится фиктивен, а локальная переменная выпадает из кода за ненадобностью.
    Это все - результат работы NRVO - Named Return Value Optimization.
  • Почему не вызвался конструктор копирования и деструктор?

    @MarkusD Куратор тега C++
    klajowski , каким стандартом языка ты пользуешься для изложения этого кода?
    Пока я не вижу предпосылок к тому чтобы конструктор копирования у тебя должен был вызваться.
  • Для чего объявляется вложенная структура (или класс) перед тем, как она объявляется дружественной?

    @MarkusD Куратор тега C++
    Qubc, давай немного ясности внесу. Ответ пусть так и остается решением.
    struct Pointer; - это предварительное объявление структуры в пространстве имен типа Holder.
    friend struct Pointer; - тут нужно проявить внимательность.
    Обратимся к описанию (3) из документации.
    The name of the class that is used in this friend declaration does not need to be previously declared.

    Это - предварительное объявление структуры с указанием ее дружественности. Вопрос только в том, к какому пространству имен относится это предварительное объявление? Ответ тоже есть в документации по дружественности.
    When a local class declares an unqualified function or class as a friend, only functions and classes in the innermost non-class scope are looked up, not the global functions

    Такой поиск имени напоминает Unqualified name lookup [?].
    Иными словами, предварительное объявление дружественной структуры Pointer будет произведено в том пространстве имен, где определен тип Holder, а не в его пространстве имен.

    Теперь собираем код в кучку. Чтобы дружественной была назначена именно структура Holder::Pointer, требуется сперва сделать предварительное объявление структуры Pointer в пространстве Holder.
    В это же время стоит обратиться к описанию (4) из документации дружественности. Начиная с C++11 можно пользоваться формой friend Pointer; чтобы использовать уже объявленное имя вместо создания предварительного объявления этого имени.

    По итогу лишним в твоем коде является только слово struct в строке friend struct Pointer;. Да и то только если ты пользуешься C++11.
    В остальном обе строки создают точное понимание того, какой именно тип ты хочешь объявить дружественным.

    В качестве дополнения:
    Структура, объявленная как вложенная, не получает автоматического доступа
    к закрытым членам внешней структуры.

    Это все враки. Документация по вложенным типам говорит иное.
    Like any member of its enclosing class, the nested class has access to all names (private, protected, etc) to which the enclosing class has access ...

    Поэтому лишним в данном случае является как предварительное объявление Pointer, так и объявление его дружественности. С поправкой, конечно, на C++11.