0

Matlab コーダーを使用して、Mathlab .m ファイルから dll ファイルを作成しました。matlab では、matlab コードはエラーなしで正常に実行され、DLL の作成は成功しました。MV2010 は正常にコンパイルおよび実行されます。ただし、ソフトウェアが Visual Studio でこの DLL から任意の関数を呼び出すと、メモリ ロケーションで「未処理の例外」が発生し、別のメモリ ロケーションで「アクセス違反読み取りロケーション」が発生します。

作成されたdllは、欠落している別のdllに依存していると思いました。そこで、依存関係の確認には依存関係 Walker を使用しました。ただし、Dependency Walker では、欠落している依存関係は示されませんでした。

Matlab 関数は 5 つの入力変数 (4 つは double として、1 つは double の 1D 配列として) を取り、4 つの double 値を返します。そのため、matlab で生成されたコードに渡す配列のサイズが小さいのではないかと考えました。そのため、配列のサイズを変更しました。元のサイズは 750 でしたが、新しいサイズは 5000 です。まだ同じ未処理の例外が発生しています。

この未処理の例外をデバッグする方法はありますか? 他に確認する必要があることはありますか?

/* 関数宣言 */

extern void mat3(double ValueF, double DesiredValue, double io, double del, emxArray_real_T *a, double *status, double *slope_deg, double *fval, double *SVal);

以下に示すように、MS2010でこのメソッドを呼び出しています。

 double lValueF = 166.6;
 double lDesiredValue = 42.00;
 double io = 1.0;
 double del = 4.0;

 emxArray_real_T *lInputRoi;
 // a = emxCreate_real_T(height,width);
 lInputRoi = emxCreate_real_T(size_y,size_x);

// Converting 2D image to ID array
  if(!isHorz)
  {
      int lRow = 0;
      int lCol = 0;
      for (int row=roi.y+odd_y_offset;row< roi.y+size_y;row=row+2)
      {
          lCol = 0;
          for (int col=roi.x;col< roi.x+size_x;col++)
          {
              lInputRoi->data[lRow *size_x + lCol] = (real_T)img.at<uchar>(row,col);
              lCol++;
          }
          lRow++;
      }
  }
  else
  { 
      int lRow = 0;
      int lCol = 0;
      for (int col=roi.x+odd_x_offset;col< roi.x+size_x;col=col+2)
      {
          lRow = 0;
          for (int row=roi.y;row< roi.y+size_y;row++)
          {
              lInputRoi->data[lCol *size_y + lRow] = (real_T)img.at<uchar>(row,col);
              lRow++;
          }
          lCol++;
          size_x = roi.height;
          size_y = roi.width;
      }
  }

// initializing matlab generated function
  mat3_initialize();

  double lStatus = 0;

  double lslope_deg = 0.0;
  double lfreqval = 0.0;
  double lsfrvalue = 0.0;

  mat3(lValueF, lDesiredValue, io, del, lInputRoi, &lStatus, &lslope_deg, &lfreqval, &lsfrvalue);

注: 1) img -> は入力画像データです。2) roi -> は、2 つの int 変数 (x と y) を持つ struct 型のオブジェクトです。 3) MV2010 アプリケーションは、「共有 DLL 内の MFC」を使用するアプリケーションです。 4) Mathlab を統合する方法に関するチュートリアルを見てきました。 Microsoft Visual studio で生成された dll。ただし、チュートリアルではエラーは発生しません。http://www.mathworks.com/videos/integrate-code-into-visual-studio-77402.html

事前にご協力いただきありがとうございます。

4

0 に答える 0