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

    @MarkusD Куратор тега C++
    lightalex , в дополнение скажу так, что в системе с динамическим связыванием самое важное - это соглашение о вызовах функций (Calling Convention).
    https://msdn.microsoft.com/en-us/library/k2b2ssfy.aspx

    Важнее всего - выработать соглашение о передаче параметров.
    https://msdn.microsoft.com/en-us/library/984x0h58.aspx

    Для все той же программы я принял что весь низкоуровневый код будет работать по схеме "cdecl" - стандартной для c++.

    Еще важно знать что между функциями из разных модулей обмениваться желательно только POD типами:
    en.cppreference.com/w/cpp/concept/PODType

    Если надо прокинуть объект, то делать это надо через указатель на интерфейс. И указатель должен быть голым (Raw Pointer). При этом, с другой стороны вызова функции пользоваться желательно только функциями этого интерфейса. И еще с этим интерфейсом желательно не делать никаких преобразований к другим типам.

    Всегда следует помнить что внутри плагина среда исполнения может оказаться другой по сравнению с основным приложением.

    Может быть ты это все и так знаешь... А может быть и нет. Я просто делюсь информацией.
  • Как динамически подключать библиотеки?

    @MarkusD Куратор тега C++
    lightalex , точно в том-же проекте используется схема плагинов на основе интерфейсов объектов.

    conv-core содержит объект логгера, который, на самом деле, представлен C# объектом. Так вот conv-core отдает интерфейс объекта логгера в плагин, чтоб тот писал свои сообщения.
    В результате, все плагины пишут в единый системный лог приложения, куда пишет и само приложение.

    Точно так же, подключая к себе библиотеку плагина, conv-core забирает указатель на объект дескриптора плагина - вот на такой интерфейс:
    https://github.com/FrankStain/tex-conv/blob/master...

    Объект этого интерфейса статически располагается в памяти плагина, т.е. объект размещается на образе DLL плагина. К примеру из плагина для DDS все выглядит так:
    https://github.com/FrankStain/tex-conv/blob/master...
    https://github.com/FrankStain/tex-conv/blob/master...
    https://github.com/FrankStain/tex-conv/blob/master...

    В общем, в том проекте такое уже реализовано. :)
  • Как исправить конфликт заголовочных файлов?

    kenny182 , нужна репродукция ситуации. Иначе гадать на кофейной гуще можно до посинения.
  • Что делать если выдает ошибку в visual studio 2015 при работе с python tools for visual studio?

    Андрей Клэй , вопрос в ответе не нуждается. Тебе все написали прямо в сообщении об ошибке.
    Помимо MSVS и PTVS тебе еще надо поставить сам питон.
    Окружения питона для PTVS редактируются в настройках MSVS.
  • Как грамотно спроектировать структуру приложения?

    Дмитрий , по изложенной картине можно гадать как по кофейной гуще. Эффект будет таким же.

    Хорошо, ты уже написал что будешь основывать на этом проект. А что это за проект? Какие у него цели? Какие функции?
    Я достаточно часто встречаю ситуацию, когда вместо того, чтобы описать мне задачу, мне пытаются предоставить информацию как эту задачу решать. И информацию дать пытаются именно те, от кого это никогда не потребуется.

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

    @MarkusD Куратор тега C++
    Koala-Punch , этож такой жуткий кошмарищще... аж развидеть хочется.
    Так, с постановкой вопроса у тебя большие проблемы. Вопрос даже после твоих уточнений никак понятен не стал.

    Ты лучше вот что скажи. Изначальная иерархия классов тобой создана? Или это учитель дал? Изменить ее можно?
    Хотя, думаю, даже если ее дал учитель, то изменить ее все равно можно.

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

    @MarkusD Куратор тега C++
    Ingernirated , на этот вопрос я не могу ответить, т.к. не владею нужной информацией. :)
    Я использую эти инструменты только тогда, когда их выбор оправдан вескими доводами.

    Как заметил Saboteur , преимущество C# перед C++ , прежде всего, в скорости разработки.
    В частности, скорость компиляции и запуска в C# в несколько раз быстрее, а модульная организация не порождает каскадной сборки кода, который не был затронут разработчиком. Это приводит к очень сильному сокращению цикла разработки и тестирования. Управление памятью средствами C# тоже сильно повышает скорость разработки, но этот довод для меня (как для пользователя C++) всегда был самым незначительным.
    Так же C# "из коробки" предоставляет очень богатый набор инструментов, включая инструменты конкурентной разработки и параллелизма. C++ обязывает реализовать эти инструменты или использовать сторонние библиотеки, в каждой из которых есть свои соглашения и допущения.
    А хороший механизм оптимизации во многих случаях сводит к минимуму разницу в быстродействии между C# и C++ (но не во всех).

    Saboteur , не спора ради.
    https://github.com/Microsoft/referencesource - .NET открыт полностью.
    https://en.wikipedia.org/wiki/.NET_Compiler_Platform
    https://github.com/dotnet/roslyn - Roslyn так же открыт.

    На самом деле вся экосистема C# уже года с два является полностью открытой и ведет активную экспансию в другие оси. И я нахожу этот момент позитивным.
  • Зачем был создан C#?

    @MarkusD Куратор тега C++
    Saboteur , а документальное подтверждение проприетарности и ограниченности только средой Microsoft можно?

    https://en.wikipedia.org/wiki/C_Sharp_(programming...
  • Как преобразовать string к wstring?

    @MarkusD Куратор тега C++
    CodeInside , покажи содержимое своей std::string в виде строки из отладчика и в виде hex byte stream вроде "D0BFD180D0B8D0B2D0B5D182".
  • На чем писать сервер для игры?

    Bloodskys , такие вопросы обычно остаются без решений и вообще являются риторическими, поэтому коммент, а не ответ.

    2КБ/сек - это нисколько даже на одного игрока. Точные данные для примера - клиент RO получал около 1МБ трафика в час, т.е. порядка 17КБ в секунду. И это был крайне экономичный протокол. Сейчас есть куда прожорливее примеры.

    Для сервера хорошо подходит C#, особенно если умеешь конкурентность и параллелизм. Если знаком с микроядерной архитектурой и архитектурой сервисов/микросервисов, то на C# вполне получится создать горизонтально расширяемый сервер с поддержкой сотен тысяч пользователей в онлайне. Разработка на C# значительно быстрее чем на C/C++, а номинальная надежность кода значительно выше чем в C/C++. Быстродействие достигается горизонтальным расширением и параллелизмом, чего в C# добиться значительно проще чем во все тех же C/C++.
    C/C++ - это инструмент для совсем других целей.
  • Сложная бизнес-логика. Как всё учесть?

    GLeBaTi , сервер state-less чтоли?
    От части nirvimel говорит правильно. Но его слова - это лишь вершина айсберга. Дальше, чтобы понять проблему и дать точное решение, тебе придется нарушить NDA (или мне придется его подписать) и рассказать мне все тонкости организации сервера. Только я не могу этим всем заниматься. :)

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

    Дальше, чтобы вносить пояснения и передавать только нужную информацию, мне нужны вопросы от тебя.
  • Сложная бизнес-логика. Как всё учесть?

    GLeBaTi , давай поподробнее. Сейчас все описание ничего не поясняет.
    20 сущностей - каких? Что описывают эти сущности?
    "я должен учесть это во всех местах" - зачем? Если ты это должен, глядя уже на это абстрактное описание, значит что-то с самого начала пошло не так.
    Почему количество сущностей должно увеличиваться со временем?
  • Структура данных типа очереди, позволяющая быстро определить позицию элемента. Есть?

    Сергей , почитай про бинарную кучу (Binary Heap / Priority Queue).
    Это куча на линейном списке, всегда гарантирующая изъятие самого приоритетного элемента со своей вершины, вне зависимости от того, насколько давно элемент попал в нее.

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

    Я не оформляю рекомендацию как ответ т.к. не считаю что это тебе на 100% подойдет. Но этот примитив может помочь тебе думать в нужном направлении.
  • Структура данных типа очереди, позволяющая быстро определить позицию элемента. Есть?

    Сергей , а что означает: "по элементу определить номер его позиции"?
    Чтобы найти нужный инструмент, неплохо бы сперва представить себе его во всех красотах.

    Какая цель перемещения элементов? А для чего нужно знание позиции? Всегда ли удаление происходит только из головы? Всегда ли добавление происходит в хвост?
    Нужно ли выбранный элемент перемещать в сторону хвоста? Или перемещать нужно только в сторону головы?
    Элементы в контейнере уникальны или имеются дубликаты? По ссылке ли хранятся элементы или по значению? Две разные инстанции элемента с одинаковым контентом будут разными или одинаковыми?

    Пока на примете только бинарная куча и интрузивный лист. Но они оба могут не подойти тебе в зависимости от ответов на вопросы выше.
  • Матрицы и выполнение собственных операций с матрицами в OpenGL?

    @MarkusD Куратор тега C++
    Toonas , дерзай. :)
    Линейная алгебра и Аналитическая геометрия - безумно интересные науки! Тебе понравятся.
    А потом, как закончишь хороший универ, буду ждать тебя в рядах игровых программистов. :)
  • В чем суть данной конструкции?

    @MarkusD Куратор тега C++
    Vitaly , это называется:
    // Happy debugging, suckers!
    #define true false
  • Матрицы и выполнение собственных операций с матрицами в OpenGL?

    @MarkusD Куратор тега C++
    Toonas , как непривычно в наше время встретить человека незнакомого с линейной алгеброй. :)
    Да, для понимания матриц и аффинных преобразований тебе стоит взять учебник по "линейке", да потолще, и впитать его в себя.

    Это не ответ конкретно на твой вопрос, это моя рекомендация в общем. Разбирая линейку, думай о 3D, тогда тебе понравится.
  • Как реализовать кроссплатформенное ПО с библиотеками для Windows/Linux?

    @MarkusD Куратор тега C++
    WayMax , у меня "platform" является только одной из подсистем и планомерно подключается, на ряду с остальным подсистемами, в мастер-заголовке библиотеки. Платформенный код является сервисным для всего остального кода.

    Для тебя, из приведенного тобой примера, я бы сформировал такие включения.
    /// @file	platform/platform.h
    // ...
    
    // lookup include directories.
    #if( BUILD_PLATFORM_WINDOWS_DESKTOP )
    	#include <platform.windows/platform.windows.h>
    #elif( BUILD_PLATFORM_ANDROID )
    	#include <platform.windows/platform.android.h>
    #else
    	#error Unknown platform.
    #endif
    
    // lookup local 'platform' directory.
    #include "File.h"
    // ...
    
    /// @file	platform.windows/platform.windows.h
    // ...
    
    // lookup local 'platform.windows' directory.
    #include "PlatformSpecificFile.h"
    // ...
    
    /// @file	somewhere/in/your/api/file.h
    // ...
    #include <platform/platform/h>
    
    // ...
    File my_file{ file_name, OpeningMode::CreateAlways, AccessOptions::Read, SharingOptions::Read };
    // ...


    Иными словами, не API в платформу, а платформа включается в API, т.к. это API зависит от платформозависимого кода, а не наоборот.

    Я не работаю в Qt, я предпочитаю MSVS. В проекте студии можно поставить игнор на компиляцию файла в строго оговоренной конфигурации проекта. Этим я пользуюсь для того, чтобы содержать ровно один проект как для сборки консольного приложения, так и для оконного или динамической библиотеки.
    Функции main, WinMain и DllMain лежат в разных файлах, которые включаются в сборку проекта только в нужной конфигурации проекта.
    По хорошему, Qt тоже должен так уметь.