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