При разработке приложений, которые используют несколько пакетов MATLAB®, полагайте, что следующее не может быть совместно использовано блоками:
Указатели функции MATLAB
Указатели фигуры MATLAB
Объекты MATLAB
C, Java® и объекты.NET
Исполняемые данные хранимы в массивах ячеек и структурах
Указатели функции MATLAB могут быть переданы между приложением и экземпляром MATLAB Runtime, из которого оно произошло. Однако указатель функции MATLAB не может быть передан в экземпляр 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
выдал бы исключение.
import com.mathworks.toolbox.javabuilder.*; import get_plot_handle.*; import plot_xy.*; class plottter { public static void main(String[] args) { MWArray h = null; try { plotter_handle = new get_plot_handle.Class1(); plot = new plot_xy.Class1(); h = plotter_handle.get_plot_handle(1,'--rs',2.0,'k','g',10); double[] x = {1,2,3,4,5,6,7,8,9}; double[] y = {2,6,12,20,30,42,56,72,90}; plot.plot_xy(x, y, h); } catch (Exception e) { System.out.println("Exception: " + e.toString()); } finally { MWArray.disposeArray(h); plot.dispose(); plotter_handle.dispose(); } } }
Правильный способ обработать ситуацию состоит в том, чтобы скомпилировать обе функции в один пакет.
import com.mathworks.toolbox.javabuilder.*; import plot_functions.*; class plotter { public static void main(String[] args) { MWArray h = null; try { plot_funcs = new Class1(); h = plot_funcs.get_plot_handle(1, '--rs', 2.0, 'k', 'g', 10); double[] x = {1,2,3,4,5,6,7,8,9}; double[] y = {2,6,12,20,30,42,56,72,90}; plot_funcs.plot_xy(x, y, h); } catch (Exception e) { System.out.println("Exception: " + e.toString()); } finally { MWArray.disposeArray(h); plot_funcs.dispose(); } } }
Примечание
Вы могли также обработать эту ситуацию при помощи одиночного элемента MATLAB Runtime.
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 функциям.
Примечание
Вы могли также обработать эту ситуацию при помощи одиночного элемента MATLAB Runtime.