2

Matlab関数をCライブラリにコンパイルしています。私はC#アプリケーションからこのライブラリを使用しています。

Cライブラリで関数を初めて呼び出すと、すべて正常に機能しますが、2番目の呼び出しで例外が発生します-mlfMyfuncは、結果へのnullポインター挿入ポインターを返します(mlfMyfunc呼び出し後もoutput1およびoutput2パラメーターはIntPtr.Zeroです)

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エンジンの初期化が繰り返されることが原因で発生しました。Analyze関数を呼び出すたびに、エンジンが初期化され(Native.Mcl.mclInitializeApplication]、ブロック内で適切に終了されていても(Native.Mcl.mclTerminateApplication)、finally繰り返し初期化で問題が発生します。組み込みのmatlab関数は引き続き正常に機能しますが、ライブラリは機能しません。

mclInitializeApplication解決策は、呼び出しをAnalyze関数の外に移動し、アプリケーションの存続期間中に1回だけ呼び出されるようにすることです。

4

2 に答える 2

2

この問題は、Matlab エンジンの初期化が繰り返されることが原因でした。関数を呼び出すたびにAnalyze、エンジンが初期化Native.Mcl.mclInitializeApplicationされ ( )、finally ブロックで適切に終了されていても( ) Native.Mcl.mclTerminateApplication、初期化の繰り返しで何か問題が発生します。組み込みの matlab 関数は引き続き正常に動作しますが、私のライブラリは動作しません。

mclInitializeApplication解決策は、呼び出しをAnalyze関数の外に移動し、アプリケーションの有効期間中に一度だけ呼び出されるようにすることです。

于 2011-05-04T20:16:06.800 に答える
0

globalAlloc を使用して IntPtrs を割り当ててみてください

于 2011-04-29T14:06:45.620 に答える