Задать вопрос
  • Возможно ли создать на с++ дополнительное консольное окно?

    @MarkusD Куратор тега C++
    v12maksv13
    вот код

    Прошу повторно ознакомиться с регламентом работы сервиса и обратить внимание на П3.8.
    Неразборчивый текст в мыльных изображениях никого не интересует. Код нужно оформлять согласно регламенту.
  • Как работают массивы в с++?

    @MarkusD Куратор тега C++
    Borshevistiy, ты фотопленку глазами видел же? Знаешь что это такое? Сможешь ведь отсчитать N кадров от первого чтобы попасть на N-й кадр?
    Если глазами не видел, посмотри как она выглядит на старых фотографиях или в гуглокартинках.
    Один кадр фотопленки - это один объект. Сама фотопленка - это массив кадров.
  • Существует ли тенденция избегать size_t, если это возможно?

    @MarkusD Куратор тега C++
    floppa322, инструмента боится тот, кто не умеет им пользоваться :)
    Integral promotion [?] имеет место всегда быть и нередко приводит к UB для знаковых типов.
    Советую тебе бороться со страхом через познание.

    EASTL ?)

    Не, свой, кондовый, самописный с нуля еще в нулевых и нерабочий сегодня более чем на половину.
    Дело в том, что среди слабо квалифицированных пользователей C++ бытует мнение что для беззнаковых типов генерируется более тяжелый код с поведением wrap around, в то время как UB - это поведение, которого не может быть. И вот в умах таких людей уже зреет мнение о том, что код работы со знаковыми значительно быстрее.
    Но реальности плевать на их фантазии, целочисленная арифметика работает как и должна.

    Чисто к слову. Для size_t Integral promotion не выполняется по своему определению.
  • Существует ли тенденция избегать size_t, если это возможно?

    @MarkusD Куратор тега C++
    floppa322, не, программист в реальном коде увидел бы сразу что тут написана дичь :)
    Однако, приведенный тобой код с оговорками иногда случается на практике. И от таких ситуаций люди просто предохраняются всего одним сравнением. Это очень просто сделать и такую ситуацию очень легко предотвратить.

    Гораздо сложнее обстоят дела с точно такой же проверкой знакового целого. Представь себе что в блоке else ожидается строго неотрицательное значение (sizeof(int) - 10). О проверке на неотрицательность мы ровно так же забыли, как и о проверке переполнения с беззнаковым размером.
    И в результате твой же собственный код ровно так же приплыл, просто в другом месте.

    И еще интереснее дела обстоят с переполнением знакового - т.е. с UB в коде. Я когда-то уже имел дело с профессиональным кодом профессионального игрового движка, где есть свой STL и в нем все размеры указываются в int. И знаешь что? Там UB изо всех щелей торчит в коде. Тут размер выделили, там умножили, сям прибавили и... ой... UB...
    А ведь, на секундочку, переполнение int наступает уже просто тогда, когда ты решаешь выделить битовую матрицу 8192x8192 с ячейкой в 64 бита. Или битовый объем 512*512*512 с ячейкой 32 бита. Там выходит ровно 4ГБит информации. Да, такие размеры иногда бывают нужны. Это всего 536МБ.
    А еще с int в качестве размера все время приходится проверять на соответствие диапазону вместо одиночной проверки для беззнакового.

    Но и это еще не все. Чтобы увидеть надуманность твоих доводов в комментариях к решению, достаточно просто прочитать документацию. Яб оформил свою речь в ответ если бы обладал достаточным временем. Но времени у меня сейчас нет. Поэтому оставляю этот момент с документацией на тебя. :)
  • Существует ли тенденция избегать size_t, если это возможно?

    @MarkusD Куратор тега C++
    floppa322 ,
    тенденция избегать size_t из-за того, что он является беззнаковым, например, чтобы не попасть на неожиданные signed/unsigned promotion'ы или остатки по модулю 2^N ?

    Специально выделю в цитату чтобы показать что я это прочитал. Потому что.

    И все же, есть ли какие-либо причины действительно избегать типа size_t? К обозначенному в цитате еще вернемся отдельно.
    Или, наверное так. Есть ли какие-либо причины использовать тип знакового целого вместо size_t?
  • Надо ли добавлять сессию в каждый пакет UDP?

    Армянское Радио, для меня, на самом деле, оба транспортных протокола выглядят равнозначными при соблюдении условий их применения.
    UDP действительно позволяет быстрее доставить данные. Более того, зачастую я могу даже отключить проверку целостности датаграммы чтобы повысить шанс ее доставки ценой порчи ее данных. Доставка хоть части данных бывает выгоднее ее потери из-за повреждений.
    TCP же позволяет рекордно сократить расходы на разработку протокола за счет своих свойств тогда, когда важна не только гарантированная доставка, но и доставка со строгим соблюдением очередности данных.

    Исходя из свойств игры, требований к сети и условий разработки можно сделать выбор между одним или другим. И не всегда этот выбор бывает окончательным. При необходимости TCP можно позже заменить более быстрой схемой гарантированной доставки на базе UDP от Гленна Фидлера.
  • Надо ли добавлять сессию в каждый пакет UDP?

    Армянское Радио, эти мифические действия работают всегда и у всех. Говорю об этом как разработчик уже трех ММО проектов с сетью на базе TCP протокола (кастомы RO, Minecraft и проект Skylore) и разработчик сетевого уровня таких проектов, как Quake Champions и WWZ, сеть в которых строится поверх UDP.
    Мы решали разные проблемы трафика для iOs, Android, PS4, XBox, ПК и Switch. И всегда добивались нужного результата. И я сразу сказал что с UDP проблем фрагментации значительно больше.

    Статей в открытом доступе нет, есть только за деньги и за участие в игровой индустрии. Но это не беда, ведь есть документация сокетов Беркли. Там все хорошо описано, при ее изучении можно до всего дойти самостоятельно.
  • Надо ли добавлять сессию в каждый пакет UDP?

    Армянское Радио,
    потому что пакеты UDP быстрее проскакивают через маршрутизаторы, не встречая на своем пути интересные алгоритмы управления потоком, которые применяются к пакетам TCP

    Это не так. Для сетей маршрутизации пакет все равно представлен IP датаграммой, будь это TCP- или UDP-пакет.
    Правила роутинга по протоколам транспортного уровня имеются, но не являются страшными.

    TCP не используют в связи с тем, что чаще всего не знают как по каналу передавать свои данные. Зачастую я в сетевом коде проектов наблюдаю полнейший бедлам без структуры и какого-то намека на здравый смысл. Люди в датаграмму UDP пишут как будто в файл со своей строго определенной тематикой и отсылают десятки и сотни таких датаграмм за один такт симуляции.
    Отдельные люди, кому посчастливилось читать Гленна Фидлера, пробуют реализовать свой сеансовый уровень поверх UDP тоже не изобилуя структурностью данных в пакете.
    А по TCP обычно вижу передачу json-ов и xml-ек а-ля SOAP и такое прочее. За голову хвататься в пору с таких зрелищ. :)

    Талян
    TCP можно использовать и его используют. Просто считается, не без эффекта весомости мнения Гленна, что TCP увеличивает латентность передачи данных. Слухи молвят что TCP безусловно буферизирует исходящий трафик до заполнения всего кадра отправки. И что это может привести к латентности в сотни миллисекунд, что недопустимо для игр.
    Это тоже неправда, задержку от буферизации TCP можно нивелировать техническими приемами и настройками протокола.

    При этом у UDP есть другая, куда более серьезная, проблема, связанная с MTU, фрагментацией и алгоритмами этой самой фрагментации в роутерах разных производителей.
    MTU (Maximum Transmission Unit) определяет максимальный размер пакета, который не подвергнется фрагментации при передаче по определенному маршруту.
    Алгоритмы фрагментации бывают разные, но основных - два: Traffic Shaping и Traffic Control.
    Шейпинг просто режет датаграмму "под орбу". Все что больше MTU отсекается, остальное отправляется дальше по маршруту. Множество дешевых домашних роутеров занимаются именно этим при маршрутизации.
    Контроль организует фрагментацию датаграммы до размера MTU и отправляет уже как цепочку фрагментированных датаграмм.
    Оба этих алгоритма резко повышают шансы большой датаграммы стать потерянной. И если при контроле датаграмма может быть только частично потеряна, то в результате шейпинга датаграмма вообще всегда считается потерянной, даже если доставлена. Такие датаграммы на обработку могут поступить только если были отправлены с соответствующими флагами.
    И вот еще вишенка на этом торте: по разным маршрутам могут встречаться разные устройства с разными алгоритмами фрагментации. Тут пакет законтроллили, а там - уже зашейпили и всё.
    Многие протоколы сегодня из-за этого боятся слать датаграммы больше 500Б. При этом, таких датаграмм отсылается в избытке, что создает значительную сервисную нагрузку на сетевой канал. Ведь каждая датаграмма будет нести в себе один и тот же IP заголовок (28/48Б в зависимости от версии протокола IP), а это до 10% трафика при датаграммах по 500Б.

    В этом плане TCP значительно выгоднее за счет только того, что берет на себя весь этот сервис с пакетами.
    Профиль современной игры (на дистанции уже 12 лет) требует канал от 512КБит/сек до 2.5МБит/сек, что складывается из 30, 60 или 96 операций приема-передачи трафика около 1-2КБ за одну операцию приема-передачи.
  • Как проверить если ли буква в массиве?

    @MarkusD Куратор тега C++
    JavaSscriptNoob, в таком случае тебе стоит отметить ответ как решение.
  • Как проверить если ли буква в массиве?

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

    @MarkusD Куратор тега C++
    Mercury13,
    Нет второй части мерлезонского балета

    Правда нету? А если присмотреться?
  • Стоит ли учить C++, если нет возможности использовать Unreal Engine?

    RabraBabr, ну погорячился немного. Исправляю ситуацию как могу. :)
    Я думаю, он пока еще не в курсе реальности игровой индустрии.
  • Стоит ли учить C++, если нет возможности использовать Unreal Engine?

    OcToF, да не беспокойся ты так. Ты задал вопрос и у тебя будут соответствующие уровню твоего вопроса ответы.
    От меня ответа не стоит ждать, у тебя вопрос не ко мне.
  • Как создать новый экземпляр класса переменной?

    @MarkusD Куратор тега C++
    Mercury13, второй вариант - это не миксин. Я, кстати, не совсем понимают терминологию рекурсивного шаблона.
    Второй вариант крайне редко реализуем на практике.

    А вот миксин реализуется всегда. Суть миксиа ведь не в том чтобы встроиться в цепочку родства, а в том, чтобы примешать функциональность.
    template< typename TImplementation >
    class Cloneable
    {
    public:
      std::unique_ptr<TImplementation> Clone() const;
    // ...
    };
    
    class MyClass : public BaseClass, public Cloneable<MyClass>
    {
      friend class Cloneable<MyClass>;
      // ...
    };

    Виртуальность в миксине не нужна, в цепочку наследования он не встраивается, функциональность подмешивает через свой интерфейс и использование внутреннего интерфейса класса реализации.
    Начиная с C++20 такие примеси не будут занимать места в памяти экземпляра.
    Проблемы в static_cast лично я никакой не вижу. Приведение типа времени трансляции с полной проверкой на соответствие. Никаких проблем нет.
    Макросы в этом коде совершенно не нужны.
  • Стоит ли учить C++, если нет возможности использовать Unreal Engine?

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

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

    @MarkusD Куратор тега C++
    Mercury13, я многое могу понять, но вот наличие в примере макросов понять не могу.
    Почему не миксином?
  • Стоит ли учить C++, если нет возможности использовать Unreal Engine?

    OcToF, вот почему я спрашиваю.
    Разработка ПО связана со строгим соблюдением большого ряда требований, стандартов, нормативов и регламентов.
    Работа с инструментом C++ вообще от человека требует предельной педантичности и буквально догматизма в отношении стандарта языка.

    Тебе не до соблюдения правил и правильного построения текста, это я вижу. Тебе ничего не мешало, но ты не стал читать правила и просто пошел нарушать их (П3.1, П3.2, П3.5, П3.6). Ты не стал утруждать себя формулировками и подачей текста в вопросе чтобы другие люди могли лучше тебя понять.
    Тебе не нужен ответ на твой вопрос, ты не прикладываешь усилий для получения этого ответа.
    Тебе незачем идти в гймдев, а особенно туда, где используют C++. Код ты будешь писать ровно так же, как текст своего вопроса, а значит ты не сможешь работать с C++.
  • Стоит ли учить C++, если нет возможности использовать Unreal Engine?

    OcToF, я задам тебе довольно простой и прямой вопрос. В моем вопросе нет подтекстов и тайных смыслов.
    Тебе что-то мешало весь этот текст написать с соблюдением правил Русского языка?
  • Как подключить библиотеку Vosk-api?

    Zupand, замечательно. Это пакет .NET C#. Ссылка на него приведена в том же руководстве по установке.
    Это не то что тебе надо. Тебе нужен код из гитхаба, тебе нужно оформить этот код в проект студии, подключить этот проект в свое целевое решение, настроить зависимости между твоим проектом и добавленным проектом vosk. И только после этого у тебя должно все заработать.
    Или не заработать если ты что-то сделал неправильно. В любом случае, план для тебя таков: тебе нужно научиться добавлять сторонний код в виде проектов в свое решение. Тебе нужно разобраться в типах проектов студии и выбрать правильный тип для библиотеки vosk. Тебе нужно разобраться в зависимостях между проектами студии.
    Это все есть в документации MSDN.