При разработке приложений, использующих несколько общих библиотек MATLAB ®, необходимо учитывать следующее:
Каждая общая библиотека MATLAB должна быть инициализирована отдельно.
Каждая общая библиотека MATLAB должна завершаться отдельно.
Дескрипторы функций MATLAB не могут совместно использоваться общими библиотеками.
Дескрипторы фигур MATLAB не могут совместно использоваться общими библиотеками.
Объекты MATLAB не могут совместно использоваться общими библиотеками.
Объекты C, Java ® и .NET не могут совместно использоваться общими библиотеками.
Исполняемые данные, хранящиеся в массивах и структурах ячеек, не могут совместно использоваться совместно используемыми библиотеками
Для инициализации и завершения работы нескольких общих библиотек:
Инициализация среды выполнения MATLAB с помощью mclmcrInitialize().
Вызовите часть приложения, которая выполняет код MATLAB с помощью mclRunMain().
Перед инициализацией общих библиотек инициализируйте состояние приложения MATLAB с помощью mclInitializeApplication().
Для каждой общей библиотеки MATLAB вызовите сгенерированную функцию инициализации, libraryInitialize().
Добавьте код для работы с кодом MATLAB.
Для каждой общей библиотеки MATLAB освободите ресурсы, используемые библиотекой, используя сгенерированную функцию завершения. libraryTerminate().
Освобождение ресурсов, используемых средой выполнения MATLAB, путем вызова mclTerminateApplication().
В этом примере показано использование двух общих библиотек.
Дескриптор функции 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 в функции.