При разработке приложений, которые используют несколько MATLAB® Блоки.NET, полагайте, что следующее не может быть совместно использовано блоками:
Указатели функции MATLAB
Указатели фигуры MATLAB
Объекты MATLAB
C, Java®, и объекты.NET
Исполняемые данные хранимы в массивах ячеек и структурах
Указатели функции MATLAB могут быть переданы между приложением и экземпляром MATLAB Runtime, из которого оно произошло. Однако указатель функции MATLAB не может быть передан в экземпляр MATLAB Runtime кроме того, в котором он произошел. Например, предположите, что у вас было две функции MATLAB, get_plot_handle
и plot_xy
, и plot_xy
используемый указатель на функцию создается get_plot_handle
.
Если вы скомпилировали их в две разделяемых библиотеки, вызов 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. Этот конфликт может произойти, когда функция, которая возвращает объект и функцию, которая управляет тем объектом, скомпилирована в различные блоки.
Например, вы разрабатываете класс банковского счета и две функции. Первое создает банковский счет для клиента на основе некоторого набора условий. Вторые фонды передач между двумя учетными записями.
Если вы скомпилировали open_acct.m
и transfer.m
в отдельные блоки вы не могли передать фонды с помощью учетных записей, созданных с open_acct
. Вызов transfer
выдает исключение.
Один способ разрешить это состоит в том, чтобы скомпилировать обе функции в один блок. Вы могли также осуществить рефакторинг приложение, таким образом, что вы не передаете объекты MATLAB функциям.