• Аналог QStringBuilder для ванильного с++. Где взять?

    Nipheris
    @Nipheris Куратор тега C++
    std::stringstream

    По поводу "лишнего выделения памяти" - это надо брать реализации и сравнивать (т.е. не могу сказать насколько QStringBuild лучше/хуже std::stringstream), но, как говорится, look&feel почти такой же. Вместо процентиков поставьте <<, а потом вызовите .str()
    Ответ написан
    6 комментариев
  • Какие есть визуальные инструменты для создания архитектуры БД?

    Т.к. не написано про бесплатность, то классика жанра - ERwin.
    Ответ написан
    Комментировать
  • Как правильно перевести из 16СС в 2СС?

    Nipheris
    @Nipheris Куратор тега C++
    В дополнение к MiiNiPaa скажу, что все ваши числа и так хранятся в двоичной системе счисления, сегодняшняя популярная выч. техника с другими системами не работает. Другое дело - в какой СС вы хотите эти числа выводить на экран/в файл, в общем - преобразовывать в человеко-читаемую строку. Поэтому в целом вопрос сводится к чтению справки по аргументам printf или по директивам потоков C++.
    Ответ написан
    Комментировать
  • Дерево выражений не может содержать динамическую операцию?

    Nipheris
    @Nipheris Куратор тега C#
    Компилятор жалуется на то, что где-то в ваших лямбдах он столкнулся с dynamic, и разумеется он не может его вкомпилить в expression tree. Скорее всего, p был dynamic, а t - нет. Укажите в вопросе конкретные типы контейнеров, по которым вы делали Find и Where, может ситуация понятнее станет (и заодно, какие интерфейсы они реализуют - IEnumerable<T> или IQueryable<T>).
    Ответ написан
  • C++11, C++14. Использование auto - признак дурного тона?

    Nipheris
    @Nipheris Куратор тега C++
    Такие дельные советы тут...

    А правило проще некуда: если вы без указания типа и так УЖЕ ИМЕЕТЕ достаточно информации, чтобы уверенно работать со значением - тогда можно использовать auto. Если чувствуете, что не имеете, или сомневаетесь, что имеете - лучше тип указать. Пример, где использование auto отлично подходит - итераторы:
    std::list<int> items;
    auto i = items.cbegin();

    Во второй строке четко написано - items.cbegin - константный итератор по items, бегущий с начала списка. Мне этого более чем достаточно. Указание типа std::list<int>::const_iterator мне никакой новой информации не принесет. Тем более, т.к. итераторы от разных контейнеров несовместимы, то мне нужно еще и сразу знать, по какому конкретно списку у меня итератор - я опять-таки посмотрю на items.cbegin, а не на тип.

    А вот auto в объявлениях функций/методов и правда ни к чему. Его, кстати, даже не сразу там разрешили использовать (только в C++14). Причина тому вновь читабельность - чтобы понять, что возращает функция, нужно прочесть ее текст как минимум до первого return, а лучше - полностью. Единственный сценарий, где без auto не обойтись при указании возвращаемого типа - это стрелочная нотация с decltype, но я думаю вы не скоро с ней столкнетесь.
    Ответ написан
    Комментировать
  • Как избавиться от подобных предупреждений в тимсити?

    Nipheris
    @Nipheris Куратор тега C#
    Пользоваться NuGet для работы с зависимостями (https://www.nuget.org/packages/CompareNETObjects/ как раз то что вам нужно), а если уже пользуетесь - очевидно, нужно пофиксить список зависимостей в packages.config, или же сделать nuget restore перед вызовом MSBuild.
    Раз сборка не находится, то либо: а) путь к ней неверный; б) путь верный, но она не выкачивается nuget-ом при сборке;
    Еще может быть в) косяк с версиями/токенами, но это маловероятно.

    Ну и само собой, если у вас код компилится и работает без проблем, удалите вообще этот референс из проекта.
    Ответ написан
    Комментировать
  • Возможно ли написать клиент сервер для смартфона?

    И чем может быть ограничена работа такого приложения?

    Работа такого приложения [без связующего сервера] может быть ограничена и будет ограничена фактом использования серых IP-адресов в сети мобильного провайдера, а также более агрессивными дефолтовыми настройками маршрутизации, которые врядли допустят TCP-подключение одного клиентского устройства к другому.

    P.S. Обращаю внимание на условия "произвольный смартфон", "3G", "без связующего сервера". Для меня "произвольный" - это когда один смартфон сидит в Волгограде, а другой - в Мурманске.
    Ответ написан
    2 комментария
  • Как правльно произвести вызов события из потока?

    Nipheris
    @Nipheris Куратор тега C#
    Когда Б обрабатывает событие, возникает исключение как будто метод класса Б работает в потоке объекта А, это нормально?

    Ну вы же инвокнули ивент в другом потоке, с чего бы ему автоматически искать другой, "нужный" поток? Вы сами должны знать, в каком потоке вам поднимать событие. Если оно внутреннее, то может и в рабочем потоке правильно его генерировать, а если событие видно извне (т.е. можно подписаться извне класса), а сам класс А абстрагирует существование и работу некоего другого потока (т.е. клиенты НЕ должны об этом знать) - то тогда логично самому заботиться о передаче ивента в нужный поток. Помните, что именно вы определяете поточную архитектуру приложения, и вам решать какой код в рамках каких потоков будет отрабатывать.

    Пофиксил через SynchronizationContext, но может быть есть получше варианты?

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

    Nipheris
    @Nipheris Куратор тега C++
    Ваша проблема решается даже не просто, а элементарно.
    Для этого нужно запомнить простейший способ передачи групп элементов переменной (т.е. заранее неизвестной) длины: сначала передавать длину, а потом уже сами элементы в нужном количестве.
    Этот подход используется повсеместно. Например, когда на диск сохраняют строки переменного размера, и в строке неудобно/невозможно применить символ-терминатор, то сначала записывают длину строки (неотрицательное число нужной разрядности - байт, 2-х байтовое целое, 4-х байтовое целое), а потом уже содержимое строки. Кстати, такие строки называются паскалевскими (в альтернативу нуль-терминированным Cи-строкам).
    Разумеется, приемник пакета должнен быть достаточно умным, чтобы сначала принять длину, выделить себе некую стркутуру нужного размера (вектор подходит отлично, т.к. можно попросить его сразу зарезервировать нужное количетсво элементов), а затем записать ожидамое количество элементов.

    Вариант кода передачи:
    std::vector<PacketMultiPlayer> serverMuPackets;
    ......
    const unsigned int packetsCount = serverMuPackets.size();
    send(sock,(char*)(&packetsCount), sizeof(packetsCount), 0);
    send(sock,(char*)serverMuPackets.data(), sizeof(PacketMultiPlayer) * packetsCount, 0); // Имеем право так делать, т.к. вектор гарантирует последовательное хранение элементов. Со списком подобное делать нельзя
    Ответ написан
    Комментировать
  • Как установить в Visual Studia Modeling Projects?

    Секретная техника:
    1) гуглим "visual studio community vs enterprise";
    2) открываем один из первых результатов - Compare Visual Studio 2015 Offerings;
    3) разворачиваем секцию "Architecture and Modeling", видим, что в Community доступен только пункт "Visualize solutions with Dependency Graphs and Code Maps" со сноской "Can open diagrams generated in other Visual Studio editions in read-only mode";
    4) делаем соответствующие выводы.
    Ответ написан
    Комментировать
  • Можно ли перейти от реализации для win(opengl,height map)?

    Nipheris
    @Nipheris Куратор тега C++
    0) закапываем GLUT, берем GLFW (www.glfw.org ); если это неприемлемо, отпишитесь в комментариях, сделаем другую инструкцию;
    1) берем пример, делаем окно по примеру: www.glfw.org/documentation.html
    2) когда убедились, что окно появляется и все работает, начинаем перетягивать код из урока;
    3) вызов кода отрисовки (который DrawGLScene) вставляем вместо /* Render here */;
    4) объявления виндовых дескрипторов убираем (HDC, HWND и прочие); windows.h тоже вроде не нужен;
    5) для обработки событий клавиатуры читаем вот это: www.glfw.org/docs/latest/input.html#input_keyboard , для мыши вот это: www.glfw.org/docs/latest/input.html#input_mouse . По сути все элементарно: устанавливаются колбэки, в которых уже находится код обработки;
    6) для того, чтобы адекватно выйти из главного цикла приложения (это тот, который while (!glfwWindowShouldClose(window))) в нужном месте (например, по нажатию ESC) вызываем glfwSetWindowShouldClose.

    Итого WindowProc вам уже не нужна, из WinMain возможно понадобится код инициализации и код обработки клавиатуры нужно будет вынести в колбэк.
    Вопросы в комментарии, все сразу не расскажешь.

    P.S. Вообще поищите современные туториалы, это OpenGL 2.0, этот API уже никому не нужен, в 3-м OpenGL всю архитектуру перекроили (зачем? Например затем, что вызывать glVertex для каждой вершины - это слишком затратно). Старые уроки вам будут полезны только для общего развития в CG.
    Ответ написан
    2 комментария
  • Qt progressBar, управление из своего класса?

    Nipheris
    @Nipheris Куратор тега C++
    Вариант 1:
    1) делаете в классе формы публичный метод вроде setTransferProgress(int), чтобы его можно было вызывать извне;
    2) дергаете метод формы, устанавливая нужное значение прогресса;
    3) реализуете метод setTransferProgress, чтобы он изменял состояние контролов так, как вам нужно;

    Вариант 2:
    1) делаете ваш "обычный" C++ класс QObject-классом, делаете у него слот transferProgressChanged(int);
    2) передаете объект вашего "передатчика данных" форме, и connect-ите слот transferProgressChanged к приватному методу, например updateProgress;
    3) в updateProgress обновляем контролы формы;
    Ответ написан
    2 комментария
  • Азы OpenCL( C++, Qt 5). Как собрать простейшую программу?

    Nipheris
    @Nipheris Куратор тега C++
    limon_spb пожалуй не все так просто с OpenCL.DLL и видимо ее все-таки не нужно распространять со своим приложением. Однако, как и было сказано ранее, ее интерфейс универсален и ваше приложение не придется перекомпилить под каждое устройство. Вопрос только в том, кто ее должен поставлять.

    Вот на форуме Кроноса: https://forums.khronos.org/showthread.php/6299-Ope... господин pcchen утверждает, что OpenCL.dll и ICD-либа должны устанавливаться при установке драйверов на видяху. Видимо все-таки не должны вы класть OpenCL.dll со своей программой.

    Тогда мы возвращаемся к вопросу, почему программа не запустилась у вас на машине. Случайно наткнулся на ваш вопрос 1-в-1 на SO: stackoverflow.com/questions/22098210/deploying-ope... . Я думаю у вас была та же проблема - DLL в системных папках реализует API версии 1.1, а вы разрабатываете под API версии 1.2 (что определяется теми хедерами, которые вы подключили в проект). Поэтому правильно все-таки сначала решить проблему конкретно на вашей машине. Возможно, стоит обновить драйвера, и они обновят системные библиотеки.

    В той теме на форуме так и не пришли к единому мнению относительно того, откуда должна браться OpenCL.dll. Я склоняюсь к тому, что ставить ее должны драйвера. Кстати, Dithermaster в ответах на SO говорит то же самое. Погуглите еще "deploying opencl application".
    Вот еще одна тема с обсуждением (также не советуют деплоить OpenCL.dll самому): https://forums.khronos.org/showthread.php/11392-Ye...
    Ответ написан
    2 комментария
  • Почему при попытке подписать сборку выходит ошибка?

    Nipheris
    @Nipheris Куратор тега C#
    При создании PKCS#12-контейнера (он же PFX) укажите настройку, что ключ разрешено использовать только для создания электронной подписи. Например. для openssl pkcs12 это параметр -keysig. Вы какой утилитой создавали ключ? sn?
    Ответ написан
    1 комментарий
  • Как организовать работу структуры b-дерева, файла данных и файла индексов?

    Nipheris
    @Nipheris Куратор тега C++
    Там есть поиск, вставка и удаление.
    Теперь нужно организовать работу с файлами. Файлом индексов и файлом данных.

    1) заменяете указатели на потомков в узлах дерева на абстрактные указатели или номера. Это нужно потому, что узлы дерева теперь могут быть как в основной памяти, так и на диске, поэтому при обращении к любому из узлов нужно сначала смотреть, загружен он или нет, и при необходимость загружать с диска (т.е. огранизовать простейший кэш);
    2) в листовых узлах вы будете хранить такие же абстрактные указатели, только не на узлы дерева (которые в индексном файле), а на реальные записи (которые в файле данных). С записями можно поступать точно также - проверять, загружены они в кэш или нет, при необходимость загружать и отдавать пользователю.
    3) операции изменения теперь должны научиться помечать узлы как "грязные", т.е. требующие сохранения на диск. В процессе модификации B-дерева вы помечаете как грязные все изменившиеся узлы, и потом сохраняете их диск (по окончании операции или через равные промежутки времени), после сохранения каждого узла сбрасываете флаг.

    Собственно основные изменения: организация кэша для записей данных и индекса и переделка дерева на работу с узлами через кэш, а не напрямую по указателю на BTreeNode.
    Ответ написан
    Комментировать
  • Какая разница между interface в С# и чисто виртуальными функциями в класах С++?

    Nipheris
    @Nipheris Куратор тега C++
    Одно и то же, чисто абстрактные классы в C++ это способ получить функциональность, аналогичную понятию "интерфейс" в тех языках, где оно есть (C#, Java, etc.).
    Благодаря множественному наследованию в C++ среди базовых классов могут быть как классы с реальным поведением (т.е. с реализациями каких-либо методов), так и классы-"интерфейсы", т.е. классы только с pure-virtual функциями-членами.
    Ответ написан
    Комментировать
  • Как передать char указатель функции dll, чтобы можно было в дальнейшем разобрать на массив?

    Nipheris
    @Nipheris Куратор тега C++
    [DllImport("вашалиба.dll", CharSet = Ansi, CallingConvention = CallingConvention.Cdecl)]
    public void LaunchJavaApplet([In] string[] JVMOptions);
    Ответ написан
  • Как влияют указатели на быстроту работу метода считывания цвета с битмапки?

    Nipheris
    @Nipheris Куратор тега C#
    Так влияют, что вы пишете/читаете напрямую в ту память, которая будет потом использовать Bitmap-ом для отрисовки/сохранения и всего прочего. В частности, у вас нет вызовов GetPixel/SetPixel, которые ОЧЕНЬ МЕДЛЕННЫЕ для данной задачи. У вас цикл по двум измерениям картинки, т.е. вызовов GetPixel будет width * height штук. Поверьте, это много и тяжело. Адресная арифметика, а именно
    curpos = ((byte*)bd.Scan0) + h * bd.Stride;
    намного легче. Собственно, возможность ее применения обеспечивается блокировкой реальных данных битмапа методом LockBits. Под блокировкой здесь понимается пометка для кода CLR, в частности для GC, что этот участок памяти трогать нельзя (перемещать, например), пока вы эту пометку не снимете.
    Собственно говоря, более-менее быстрая работа с Bitmap возможна только через BitmapData, так как используя Get/SetPixel вы не дождетесь конца работы вашего алгоритма.
    Ответ написан
    Комментировать
  • Event - это value или reference type в C#?

    Nipheris
    @Nipheris Куратор тега C#
    1) Ивент - это тот же делегат, только с урезанным интерфейсом для внешних обращений (за пределами класса). В public интерфейс класса от ивента попадают только операции добавления и удаления хэндлера. Вы можете инвокнуть делегат, представляющий ивент, изнутри класса, но не сможете это сделать снаружи класса (т.е., например так: button1.Clicked(new EventArgs(...)) );
    2) Раз мы выяснили, что ивент это делегат (мультикаст, причем), то идем и убеждаемся в том, что делегат это reference-тип: https://msdn.microsoft.com/en-us/library/system.mu...

    Экзамен на носу? Успешной сдачи!
    Ответ написан
    Комментировать
  • Как из файла json ввести данные в таблицу QTableView?

    Nipheris
    @Nipheris Куратор тега C++
    1) создать подходящую модель (например, наследоваться от QAbstractTableModel);
    2) загрузить данные из json;
    3) реализовать модель из п.1 так, чтобы она возращала значение конкретного свойства в зависимости от запрошенного столбца;
    Ответ написан
    Комментировать