exponenta event banner

Использование нескольких общих библиотек в одном приложении

При разработке приложений, использующих несколько общих библиотек MATLAB ®, необходимо учитывать следующее:

  • Каждая общая библиотека MATLAB должна быть инициализирована отдельно.

  • Каждая общая библиотека MATLAB должна завершаться отдельно.

  • Дескрипторы функций MATLAB не могут совместно использоваться общими библиотеками.

  • Дескрипторы фигур MATLAB не могут совместно использоваться общими библиотеками.

  • Объекты MATLAB не могут совместно использоваться общими библиотеками.

  • Объекты C, Java ® и .NET не могут совместно использоваться общими библиотеками.

  • Исполняемые данные, хранящиеся в массивах и структурах ячеек, не могут совместно использоваться совместно используемыми библиотеками

Инициализация и завершение работы нескольких общих библиотек

Для инициализации и завершения работы нескольких общих библиотек:

  1. Инициализация среды выполнения MATLAB с помощью mclmcrInitialize().

  2. Вызовите часть приложения, которая выполняет код MATLAB с помощью mclRunMain().

  3. Перед инициализацией общих библиотек инициализируйте состояние приложения MATLAB с помощью mclInitializeApplication().

  4. Для каждой общей библиотеки MATLAB вызовите сгенерированную функцию инициализации, libraryInitialize().

  5. Добавьте код для работы с кодом MATLAB.

  6. Для каждой общей библиотеки MATLAB освободите ресурсы, используемые библиотекой, используя сгенерированную функцию завершения. libraryTerminate().

  7. Освобождение ресурсов, используемых средой выполнения MATLAB, путем вызова mclTerminateApplication().

В этом примере показано использование двух общих библиотек.

 Пример кода драйвера

Работа с дескрипторами функций MATLAB

Дескриптор функции MATLAB может передаваться назад и вперед между экземпляром среды выполнения MATLAB и приложением. Однако его нельзя передать из одного экземпляра среды выполнения MATLAB в другой. Например, предположим, что у вас было две функции MATLAB, get_plot_handle и plot_xy, и plot_xy использовал дескриптор функции, созданный get_plot_handle.

% Saved as get_plot_handle.m
function h = get_plot_handle(lnSpec, lnWidth, mkEdge, mkFace, mkSize)
h = @draw_plot;
    function draw_plot(x, y)
        plot(x, y, lnSpec, ...
            'LineWidth', lnWidth, ...
            'MarkerEdgeColor', mkEdge, ...
            'MarkerFaceColor', mkFace, ...
            'MarkerSize', mkSize)
    end
end
% Saved as plot_xy.m
function plot_xy(x, y, h)
h(x, y);
end

Если вы упаковали их в две отдельные общие библиотеки, вызов plot_xy вызовет исключение.

 Пример кода драйвера

Одним из способов решения этой проблемы является пакетирование обеих функций в единую общую библиотеку. Например, при вызове общей библиотеки plot_functions, вашему приложению потребуется только один вызов для инициализации функции, и вы можете передать дескриптор функции для plot_xy без ошибок.

 Пример кода драйвера

Работа с объектами

SDK™ компилятора MATLAB позволяет возвращать следующие типы объектов из среды выполнения MATLAB в код приложения:

  • MATLAB

  • C++

  • .NET

  • Ява

  • Python ®

Однако невозможно передать объект, созданный в одном экземпляре среды выполнения MATLAB, в другой экземпляр среды выполнения MATLAB. Этот конфликт может возникнуть, когда функция, возвращающая объект, и функция, управляющая этим объектом, упакованы в различные общие библиотеки.

Например, можно сказать, что вы разрабатываете две функции. Первый создает банковский счет для клиента. Второй переводит средства между двумя счетами.

% Saved as account.m
classdef account < handle

    properties
        name
    end
    
    properties (SetAccess = protected)
        balance = 0
        number
    end
    
    methods
        function obj = account(name)
            obj.name = name;
            obj.number = round(rand * 1000);
        end
        
        function deposit(obj, deposit)
            new_bal = obj.balance + deposit;
            obj.balance = new_bal;
        end
        
        function withdraw(obj, withdrawl)
            new_bal = obj.balance - withdrawl;
            obj.balance = new_bal;
        end
        
    end
end
% Saved as open_acct .m
function acct = open_acct(name, open_bal )

    acct = account(name);

    if open_bal > 0
        acct.deposit(open_bal);
    end
    
end
% Saved as transfer.m
function transfer(source, dest, amount)

    if (source.balance > amount)
        dest.deposit(amount);
        source.withdraw(amount);
    end

end

Если вы упакованы open_acct.m и transfer.m в отдельные общие библиотеки, вы не можете перевести средства, используя счета, созданные с open_acct. Вызов transfer вызовет исключение. Одним из способов решения этой проблемы является пакетирование обеих функций в единую общую библиотеку. Можно также выполнить рефакторинг приложения, чтобы не передавать объекты MATLAB в функции.

Связанные темы