У меня есть функция 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 и гарантирует, что она вызывается только один раз за время существования приложения.