Скомпилированная функция Matlab работает только один раз - PullRequest
2 голосов
/ 29 апреля 2011

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

Если я вызываю свою функцию в библиотеке C в первый раз, все работает нормально, но второй вызов вызывает исключение - mlfMyfunc возвращает нулевой указатель, вставленный указатель на результаты (output1и параметры output2 равны IntPtr.Zero даже после вызова mlfMyfunc)

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

есть идеи, где проблема может быть?

Спасибо.Lukas

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.Каждый раз, когда я вызываю функцию Analyze, двигатель инициализируется (Native.Mcl.mclInitializeApplication], и даже если он правильно завершается (Native.Mcl.mclTerminateApplication) в блоке finally, что-то не так с повторной инициализацией. Встроенные функции matlab по-прежнему работают правильно, но моя библиотекане.

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

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

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

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

0 голосов
/ 29 апреля 2011

попытаться выделить IntPtrs, используя globalAlloc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...