Ответы пользователя по тегу C++
  • Как скомпилировать в один большой запускной файл?

    Nipheris
    @Nipheris Куратор тега C++
    он зависит от большого количества so-библиотек.

    У вас два варианта:
    1. Использовать статические варианты библиотек вместо динамических (so) - это то, что предлагает Vitaly.
    2. Продолжать собирать как сейчас, но научиться собирать нормальные пакеты под нужные вам дистрибутивы, с нормальным описанием зависимостей - тогда системный пакетный менеджер при установке вашего пакета поставит все нужные вам зависимости.

    Второй вариант сложнее, но предпочтительнее, т.к. в случае критических уязвимостей в библиотеках их можно будет обновить независимо без обновления вашего приложения. Когда вы линкуете статически, очевидно что уязвимый код в вашем бинарнике можно обновить только пересборкой этого бинарника с новой версией библиотеки, т.е. без вашего участия (если код закрыт) уязвимость не устранить. Критично ли это для вас или нет - решать вам, зависит от важности вашего приложения.
    Ответ написан
    Комментировать
  • Почему не работает foreach в C++ Qt?

    Nipheris
    @Nipheris Куратор тега C++
    На кой вам этот foreach, используйте плюсовый range-for.
    Ответ написан
    1 комментарий
  • Локальный клиент парсинга XML и обновления SQLite таблицы (C#). Возможно ли оптимизация?

    Nipheris
    @Nipheris Куратор тега C++
    Встал вопрос об оптимизации данного действия, потому как на обновление таблицы уходит минимум 2 минуты.

    Ну это известный прикол что по-умолчанию SQlite делает транзакцию на каждый insert. Запустите транзакцию и закоммитьте её один раз и все строки вставятся за секунду максимум.

    Вы начали выдумывать какие-то мегаспособы ускорения, не исследовав корень проблемы. А корень в том, что на транзакцию SQLite создаёт файл отката, и когда таки транзакций 40000, это будет столько же операций пересоздания файла. Это просто пздц какая тяжелая операция для файловой системы, и ни процессор ни многопоточность вообще не при чём. Могли бы догадаться сами, т.к. 40000 небольших записей это вообще не объём.

    Решение гуглится за 20 секунд и написано в FAQ по SQLite: www.sqlite.org/faq.html#q19
    Ответ написан
    Комментировать
  • Что будет, если переопределить деструктор в производном от QObject классе?

    Nipheris
    @Nipheris Куратор тега C++
    Мне нужно выполнить функцию при удалении объекта, поэтому я переопределил деструктор.

    Почему вы решили, что деструктор базового класса, т.е. поведение, которое отработало бы без вашего переопределения, НЕ будет вызван?
    Ответ написан
    Комментировать
  • Как создавать красивые окна на с++?

    Nipheris
    @Nipheris Куратор тега C++
    Достаточно красивые?
    А вот ещё пример довольно известного приложения продакшн уровня на Qt 5 + Qml.
    Ответ написан
    Комментировать
  • Почему некорректно обрабатываются строки в C++, и как это исправить?

    Nipheris
    @Nipheris Куратор тега C++
    cppwhispers.blogspot.ru/2012/11/unicode-and-your-a...

    In GCC, on modern systems, the default encoding for char string literals is UTF8.

    А чтобы не зависеть от компилятора и среды, курите современную теорию: раз, два.
    Ответ написан
    Комментировать
  • Ошибка std::bad_alloc - C++?

    Nipheris
    @Nipheris Куратор тега C++
    Судя по всему, у вас проезд по памяти - вы в первом цикле вылезли за границы массива s и повредили внутреннее состояние вектора v1, после чего он не может вести себя адекватно.
    Ответ написан
    Комментировать
  • Обязательно ли использовать указатели в С++ для игр?

    Nipheris
    @Nipheris Куратор тега C++
    Обязательно ли использовать С++ для игр?
    Ответ написан
    Комментировать
  • Можно ли использовать shared_ptr в играх?

    Nipheris
    @Nipheris Куратор тега C++
    Ваш вопрос настолько топорно составлен, что даже непонятно как вообще отвечать.

    1. Передачу объекта из одной среды в другую не обязательно решать блокировкой (lock) именно того объекта, что существует в "мире" lua.
    2. Даже если блокировать lua-объект, почему вы собрались это делать shared_ptr-ом?? Он как-то шарит владение с менеджером памяти lua? Не слышал о такой возможности. Т.е. я не думаю что
    Проблема решается через shared_ptr

    3. Зачем всё переписывать на использование shared_ptr?? вы хотите начать писать на плюсах как на lua? даже если бы ваши предположения в п.1 и п.2 магическим образом оказались верны, shared_ptr и сборка мусора - сильно разные вещи, не разобравшись ни в одной из них до конца, вы посчитали что это одно и то же потому что оно "похоже".
    4.
    ведь производительность упадет

    не упадёт, точнее вы этого не узнаете т.к. ничего нормального по такой стратегии не напишете.

    Пишу игру на c++ и lua.

    Вы вообще писали на C++ или сразу пишете на "C++ и Lua"?

    можно ли использовать shared_ptr в играх

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

    и есть ли какие то другие решения передачи объектов между lua и c++?

    А что говорить документация используемого вами интерпретатора lua?
    Ответ написан
    1 комментарий
  • Какую литературу почитать про C++ 11/14?

    Nipheris
    @Nipheris Куратор тега C++
    Meyers, Scott. Effective modern C++ [42 specific ways to improve your use of C++11 and C++14]
    ISBN: 978-1-491-90399-5
    https://www.amazon.co.uk/dp/1491903996
    Ответ написан
    Комментировать
  • Как внедрить все файлы в exe?

    Nipheris
    @Nipheris Куратор тега C++
    Resource Files (Visual Studio) (на русском).
    Удобная утилита для просмотра (проверить, что получилось после компиляции и что где по факту легло в ресурсах): Resource Hacker.
    Ответ написан
    Комментировать
  • Как корректно собрать C++ CUDA проект через Cmake на Linux?

    Nipheris
    @Nipheris Куратор тега C++
    cuda_compile(CudaKernel src/CUDA.cu)
    cuda_add_library(CudaKernels src/CUDA.cu)

    Подозрительно разные идентификаторы, это точно так надо? Зачем вообще этот cuda_compile? Если вы его используете, тогда вам надо то что он положит в CudaKernel подставить в cuda_add_library, например cuda_add_library(CudaKernels ${CudaKernel})

    cuda_add_executable(Mandelbrot_set $(SOURCE_FILES) CudaKernels)

    Странная конструкция. Если CudaKernels это таргет, что он делает в этом списке, где должны быть исходники?

    И должен ли src/CUDA.cu компилится дважды?
    Ответ написан
    3 комментария
  • Не могу подключить SFML, что делать?

    Nipheris
    @Nipheris Куратор тега C++
    Прописывать директории с lib-файлами.
    Ответ написан
    5 комментариев
  • Как ловить и обрабатывать любые исключения?

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

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

    Вообще посмотрите на std::current_exception, но убедитесь, что оно вам подойдёт.
    Ответ написан
    8 комментариев
  • Как сделать такую конструкцию на C++?

    Nipheris
    @Nipheris Куратор тега C++
    std::vector<std::vector<int>> vector_of_vectors;
    vector_of_vectors.push_back({ 1,1,1,1,1 });
    std::cout << vector_of_vectors << std::endl; // [[1,1,1,1,1]]
    vector_of_vectors.push_back({ 1,1,1,1,2 });
    std::cout << vector_of_vectors << std::endl; // [[1,1,1,1,1],[1,1,1,1,2]]

    https://ideone.com/GIV9dW
    Ответ написан
    Комментировать
  • Как тестировать приложение, способы и подходы?

    Nipheris
    @Nipheris Куратор тега C++
    проверка "правильности/соответсвия" возвращаемых данных определенными функциями

    Это есть модульное тестирование, см. Catch.
    проверка на используемую память(сколько используется, было использованно за весь цикл существования приложения)

    Погуглите "memory profiler" (например, valgrind.org/docs/manual/ms-manual.html ). Я обычно в Студии профайлю, с автоматизацией этого процесса пока не сталкивался, но думаю возможно.
    проверка правильности порядка записи в бд

    проверка того что в сеть уходят данные которые ожидаются от программы

    Тут вам нужно замокать клиента к бд и сетевой сокет/поток (в зависимости от того как это всё реализовано, без подробностей сложно советовать), и вместо реальной отправки данных/записи в базу делать нужные вам проверки.
    Ответ написан
    Комментировать
  • Как вызвать функции одного потока в другом?

    Nipheris
    @Nipheris Куратор тега C++
    Вы не можете вызвать "функции одного потока в другом". Каждый поток должен сам вызвать то, что ему нужно.

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

    Более конкретно ответить можно только зная какими библиотеками и API вы пользуетесь в вашем проекте.
    Ответ написан
  • Как делать GLSL шейдеры???

    Nipheris
    @Nipheris Куратор тега C++
    0. Бросать ли мне OpenGL?

    Не забудьте C++ дальше учить.
    1.Возможно ли создание шейдеров OpenGL на Visual Studio?(он же вроде с Директом дружит)

    А что конкретно от Студии нужно? Файлы редактировать сможете, расширения для подсветки тоже были, думаю сможете найти. С дебагом вроде не так круто как с HLSL, но вам может пока и не надо.
    2.Какое расширение должно быть у кода, самого шейдера?

    .frag/.vert или .frag.glsl/.vert.glsl или просто .glsl, это всё условность, загружать текст шейдеров всё равно вы сами будете.
    3.Как собрать шейдер, и где мне найти линковщик, компилятор?

    glSharedSource/glCompileShader - пока этого будет вам достаточно.

    Уже бесит меня этот OpenGL. Знал что будет не просто, но чтобы настолько.

    Видимо у вас наивное представление о предмете разговора.
    OpenGL - это графическое API, которое используется как в академической, так и в профессиональной среде. Оно конечно заметно проще чем Vulkan или тем более Direct3D, но всё-таки это не учебное API. Современные версии OpenGL отвечают требованиям даже крупных игровых проектов, т.е. у современного OpenGL достаточно продвинутая архитектура, отвечающая темпам развития графического оборудования.
    Иными словами, вы выбрали в общем-то профессиональный инструмент, и вы пока что к этому не готовы. GLSL - это отдельная большая история, он требует знаний не меньше, чем весь остальной OpenGL. По языку шейдеров пишут самостоятельные книги, по нему даже соревнования проводят на всяких сценерских движухах - кто круче шейдер напишет за ограниченное время.

    Это я пишу не чтобы отбить у вас желание учить, а для того чтобы вы понимали, что в IT и программировании есть достаточно сложные и объёмные вещи, которыми с разбегу не овладеешь. Если вы ещё и C++ только начали учить, но вам тем более тяжело должно быть. Я впервые сделал что-то потребное на OpenGL только на 4-м курсе, уже чувствуя себя комфортно в плюсах.
    Ответ написан
  • В каких случаях пишут на C вместо C++?

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

    1. Низкоуровневые задачи, где нужно иметь минимум абстракции от оборудования. Я лично хоть и не разделяю анти-C++ настроений Линуса, вполне согласен с тем что ядру полезно быть написанным на Си. В C++ есть довольно много абстракций, влияющих на исполнение кода, есть некоторые вещи "под капотом", которые могут быть недопустимы в низкоуровенвом коде.

    2. Большие проекты, где сложно форсировать code-style. С++ - это такой язык... Он настолько разнообразен, что прежде чем некая команда сядет писать код, она должна выбрать некоторое ПОДМНОЖЕСТВО языка, и использовать его. Иными словами, Плюсы - это большой ящик с инструментами, и вовсе не обязательно (даже вредно) использовать сразу все. Важно отказываться от каких-либо возможностей или практик, особенно устаревших (а таких в C++ немало, "идиоматический" код на C++03 и C++17 - очень разный). Кто не хочет со всем этим заморачиваться (вспомним опять таки Линух - огромный проект с огромным числом участников) - вполне могут выбрать Си. Ведь можно считать, что выбор языка Си - это выбор только необходимого инструментария из того что предлагается в C++ (только помните что сейчас это всё-таки разные языки).

    3. Программирование в сильных ресурсных ограничениях. Например под микроконтроллеры. Хоть в С++ программист "не платит за то чем не пользуется", иногда стандартные реализации различных механизмов недопустимо тяжелы или неэффективны. Например, если у вас очень медленный чип или мало памяти, возможно вы заходите свою собственную реализацию полиморфизма. Какой тогда смысл говорить что вы пишете на C++, если не сможете использовать его механизмы и то, что предлагает компилятор.
    Ответ написан
    Комментировать
  • Как вывести последние n элементов map?

    Nipheris
    @Nipheris Куратор тега C++
    #include <string>
    #include <map>
    #include <algorithm>
    #include <iostream>
     
    int main() {
        std::map<int, std::string> m {
            { 1, "one" },
            { 2, "two" },
            { 3, "three" },
            { 4, "four" },
            { 5, "five" },
            { 6, "six" },
            { 7, "seven" },
            { 8, "eight" },
            { 9, "nine" },
            { 10, "ten" },
        };
     
        auto from = m.end();
        // откатываемся назад на 5 элементов (возможно есть способ покрасивее)
        for (int i = 0; i < 5; i++) {
        	from--;
        }
     
        std::for_each(from, m.end(), [](auto&& pair) {
            std::cout << pair.first << ": " << pair.second << std::endl;
        });
    }


    https://ideone.com/bUps4b
    Ответ написан
    Комментировать