Скомпилированная функция Matlab работает только один раз
-
27-10-2019 - |
Вопрос
У меня есть функция 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