При разработке приложений, которые используют несколько MATLAB® Блоки .NET, считайте, что следующее не может быть общим для сборок:
Указатели на функцию MATLAB
Указатели фигуры MATLAB
Объекты MATLAB
C, Java®, и объекты .NET
Исполняемые данные, хранящиеся в массивах ячеек и структурах
Указатели на функции MATLAB могут передаваться между приложением и образцом MATLAB Runtime, из которого он происходил. Однако указатель на функцию 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
выдал бы исключение.
using System; using MathWorks.MATLAB.NET.Utility; using MathWorks.MATLAB.NET.Arrays; using get_plot_handle; using plot_xy; namespace MathWorks.Examples.PlotApp { class PlotCSApp { static void Main(string[] args) { try { // Create objects for the generated functions get_plot_handle.Class1 plotter= new get_plot_handle.Class1(); plot_xy.Class1 plot = new plot_xy.Class1(); MWArray h = plotter.get_plot_handle('--rs', (double)2, 'k','g', (double)10); double[] x_data = {1,2,3,4,5,6,7,8,9}; double[] y_data = {2,6,12,20,30,42,56,72,90}; MWArray x = new MWArray(x_data); MWArray y = new MWArray(y_data); plot.plot_xy(x, y, h); } catch(Exception exception) { Console.WriteLine("Error: {0}", exception); } } } }
Правильный способ обработки ситуации - скомпилировать обе функции в одну сборку.
using System; using MathWorks.MATLAB.NET.Utility; using MathWorks.MATLAB.NET.Arrays; using plot_functions; namespace MathWorks.Examples.PlotApp { class PlotCSApp { static void Main(string[] args) { try { // Create object for the generated functions Class1 plot= new Class1(); MWArray h = plot.get_plot_handle('--rs', (double)2, 'k','g', (double)10); double[] x_data = {1,2,3,4,5,6,7,8,9}; double[] y_data = {2,6,12,20,30,42,56,72,90}; MWArray x = new MWArray(x_data); MWArray y = new MWArray(y_data); plot.plot_xy(x, y, h); } catch(Exception exception) { Console.WriteLine("Error: {0}", exception); } } } }
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 функциям.