Скомпилированная функция Matlab работает только один раз

StackOverflow https://stackoverflow.com/questions/5832960

Вопрос

У меня есть функция MATLAB, составленная в библиотеку C. Я использую эту библиотеку из приложения C#.

Если я впервые позвоню в библиотеку C в C, все работает нормально, но второй вызов вызывает исключение - Mlfmyfunc возвращает указатель Null Pointer Insted на результаты (Pounter1 и Pourting2 Параметры являются intptr.zere даже после вызова mlfmyfunc)

Мой DoubleArray класс (обертка вокруг mx... функции), хорошо протестировано, и я думаю, что это работает правильно.

Вы хоть представляете, где может быть проблема?

Спасибо. Лукас

C# код:

using Native;

 class MatlabAlgosBridge {
   [DllImport("Algos.dll"]
   private static extern bool AlgosInitialize();

   [DllImport("Algos.dll")]
   private static extern void AlgosTerminate();

   [DllImport("Algos.dll")]
   private static extern bool mlfMyfunc([In] int nargout, ref IntPtr output1, ref IntPtr output2, [In] IntPtr xVar, [In] IntPtr time, [In] IntPtr algoParam, [In] IntPtr Ts, [In] IntPtr codes);

  public List<double> Analyze(List<double> xValues) {
    double[] result = null;
    try {
      Native.Mcl.mclInitializeApplication("NULL", 0)
      AlgosInitialize();

      DoubleArray xValM = DoubleArray.CreateMatrix(xValues.Data.Count, 1);
      // Other parameter initialization 

      IntPtr output1 = IntPtr.Zero;
      IntPtr output2 = IntPtr.Zero;

      mlfMyfunc(2, ref output1, ref output2, xValM.Pointer, time.Pointer, params.Pointer, ts.Pointer, codes.Pointer);

      result = new MArray(output1).AsDoubleVector();
    }
    finally {
      AlgosTerminate();
      Native.Mcl.mclTerminateApplication();
    }

    return result;
   }
}

Решение:

Проблема была вызвана повторной инициализацией двигателя Matlab. Каждый раз, когда я называю функцию анализа, двигатель инициализируется (Native.Mcl.mclInitializeApplication] и даже это правильно прекращается (Native.Mcl.mclTerminateApplication) в finally Блок, что -то идет не так с повторной инициализацией. Встроенные функции MATLAB все еще работают должным образом, но моя библиотека этого не делает.

Решение движется mclInitializeApplication Вызовите внешнюю функцию анализа и гарантируя ее только один раз в срок службы приложения.

Это было полезно?

Решение

Проблема была вызвана повторной инициализацией двигателя Matlab. Каждый раз, когда я звоню Analyze функция, которую двигатель инициализируется (Native.Mcl.mclInitializeApplication) и даже это правильно прекращается (Native.Mcl.mclTerminateApplication) В наконец -то что -то идет не так с повторной инициализацией. Встроенные функции MATLAB все еще работают должным образом, но моя библиотека этого не делает.

Решение движется mclInitializeApplication позвонить на улицу Analyze функционируют и обеспечивают его только один раз в срок службы приложения.

Другие советы

Попробуйте выделить Intptrs, используя GlobalAlloc

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top