Используйте несколько пакетов в отдельном приложении

При разработке приложений, которые используют несколько пакетов MATLAB®, полагайте, что следующее не может быть совместно использовано блоками:

  • Указатели функции MATLAB

  • Указатели фигуры MATLAB

  • Объекты MATLAB

  • C, Java® и объекты.NET

  • Исполняемые данные хранимы в массивах ячеек и структурах

Работа с указателями функции MATLAB

Указатели функции 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.

Похожие темы