Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (2)

Наибольший вклад в теги

Все теги (18)

Лучшие ответы пользователя

Все ответы (37)
  • Как динамически подключать библиотеки?

    @Ariox41
    Посмотрите в сторону boost::DLL

    Позволяет динамически загружать библиотеки, автоматически подсчитывает ссылки на загруженные функции и выгружает библиотеку, когда все ссылки уничтожены (нужно учитывать, что если вы получаете какие-то данные вручную, их нужно уничтожить до того, как будет выгружена библиотека, поскольку библиотека не может подсчитывать ссылки на ваши данные).

    В документации много примеров, особых проблем не должно возникнуть.

    Пример из документации, на всякий случай:
    // my_plugin_api.hpp
    #include <string>
    
    class my_plugin_api {
    public:
       virtual std::string name() const = 0;
       virtual float calculate(float x, float y) = 0;
    
       virtual ~my_plugin_api() {}
    };

    Реализация плагина:
    // my_plugin_sum.cpp
    #include <boost/config.hpp> // for BOOST_SYMBOL_EXPORT
    #include "../tutorial_common/my_plugin_api.hpp"
    
    namespace my_namespace {
    
    class my_plugin_sum : public my_plugin_api {
    public:
        my_plugin_sum() {
            std::cout << "Constructing my_plugin_sum" << std::endl;
        }
    
        std::string name() const {
            return "sum";
        }
    
        float calculate(float x, float y) {
            return x + y;
        }
    
        ~my_plugin_sum() {
            std::cout << "Destructing my_plugin_sum ;o)" << std::endl;
        }
    };
    
    // Exporting `my_namespace::plugin` variable with alias name `plugin`
    // (Has the same effect as `BOOST_DLL_ALIAS(my_namespace::plugin, plugin)`)
    extern "C" BOOST_SYMBOL_EXPORT my_plugin_sum plugin;
    my_plugin_sum plugin;
    
    } // namespace my_namespace

    Собственно, загрузка библиотеки:
    #include <boost/dll/import.hpp> // for import_alias
    #include <iostream>
    #include "../tutorial_common/my_plugin_api.hpp"
    
    namespace dll = boost::dll;
    
    int main(int argc, char* argv[]) {
    
        boost::filesystem::path lib_path(argv[1]);          // argv[1] contains path to directory with our plugin library
        boost::shared_ptr<my_plugin_api> plugin;            // variable to hold a pointer to plugin variable
        std::cout << "Loading the plugin" << std::endl;
    
        plugin = dll::import<my_plugin_api>(          // type of imported symbol is located between `<` and `>`
            lib_path / "my_plugin_sum",                     // path to the library and library name
            "plugin",                                       // name of the symbol to import
            dll::load_mode::append_decorations              // makes `libmy_plugin_sum.so` or `my_plugin_sum.dll` from `my_plugin_sum`
        );
    
        std::cout << "plugin->calculate(1.5, 1.5) call:  " << plugin->calculate(1.5, 1.5) << std::endl;
    }

    Вывод:
    Loading the plugin
    Constructing my_plugin_sum
    plugin->calculate(1.5, 1.5) call:  3
    Destructing my_plugin_sum ;o)
    Ответ написан
  • Созданный проект не запускается на других компьютерах. Что делать?

    @Ariox41
    Судя по всему, вы компилируете 64-разрядный *.exe, который не может запуститься на 32-разрядной системе. Соответственно, нужно компилировать 32-разрядный, покопайтесь в настройках проекта.
    Если это не так, предоставленной информации недостаточно (какая хоть ошибка возникает?).
    Ответ написан
  • Проблемы с компиляцией в visual studio 2015, после адаптации с visual studio 2010. Что делать?

    @Ariox41
    std::array создается на стеке как обычный сишный массив и требует указания размера во время компиляции, примерно так: std::array<int, 3> array = {1, 2, 3};

    Edit: Возможно, там нужен не std::array, а что-то другое, но где-то использован using namespace std
    Edit: Не сразу въехал во вторую часть. Шаблонный параметр должен быть известен во время компиляции, т.е. bmp->Width должен быть constexpr или statc constexpr с соответствующим синтаксисом обращения. Динамические массивы в С++ - это std::vector, у вас скорее всего использовался array из CLI, но в CLI я не разбираюсь.
    Ответ написан
  • Что нужно прочитать чтобы начать писать программы на С++?

    @Ariox41
    Если вас интересует именно графические интерфейсы, читайте книги про Qt. Потом, в случае необходимости можно будет углубиться в язык.

    Если интересует программирование на C++ в принципе, читайте Майерса. Начать стоит с этой книги. Возможно, с первого раза не все будет понятно, но она задаст направление дальнейшего развития. Затем стоит почитать "Эффективный и современный С++: 42 рекомендации по использованию C++11 и C++14" - там уже про современные стандарты языка.
    Ответ написан
  • Как правильно передать двумерный массив в функцию?

    @Ariox41
    Можно так:

    #include <array>
    
    template<std::size_t ColumnCount, std::size_t RowCount > 
    int foo(int (&matrix)[ColumnCount][RowCount]){ 
       int r = 0;
       for(auto& row: matrix){
           for(auto& x: row)
              r += x;
       }
       return r;
    }
    
    int bar(){
        int matrix [][2] = {{1, 2}, {3, 4}, {4, 6}};
        return foo(matrix);
    }


    С-массивы в функции можно передавать только по ссылке. Или преобразовать в массив указателей.

    Вообще, для передачи С-массивов придуман std::array, но двумерный C-массив нельзя напрямую привести к std::array<std::array<int, M>, N>. Но можно изначально работать с std::array:
    template<std::size_t ColumnCount, std::size_t RowCount > 
    
    int foo(std::array<std::array<int, RowCount>, ColumnCount>& matrix){ 
       int r = 0;
       for(auto& row: matrix){
           for(auto& x: row)
              r += x;
       }
       return r;
    }
    
    int bar(){
        std::array<std::array<int, 2>, 3> matrix = {{{1, 2}, {3, 4}, {4, 6}}};
        return foo(matrix);
    }
    Ответ написан