2

次の test_mex mex 関数があります。

void mexFunction(int nlhs, mxArray **plhs, int nrhs, const mxArray **prhs)
{
  const mxArray* m_var = NULL;
  if ((m_var = mexGetArrayPtr("a", "caller")) == NULL)
  {
    mexErrMsgTxt("oopsie");
  }
}

そして、次の test.m ファイル:

function test()
  a = 12345;
  test_mex();
  • 実行すると、常に失敗し、「oopsie」が出力されます。
  • グローバルを作成aし、mex 関数の「caller」文字列を「global」に変更すると、正常に動作します。

私は何を間違っていますか?

ノート:

  • これは、正に古いバージョンの matlab です: バージョン 6.1.0.450 リリース 12.1
  • mexGetArrayPtr は mexGetVariablePtr の古いバージョンであり、その引数の順序は異なります
4

1 に答える 1

1

Solarisのバージョン6.1.0.450でこの例を試しました。私が変えなければならなかった一つのことはそれでした

test_mex();

は古いバージョンのMATLABの構文エラーであり、次のように変更する必要がありました。

test_mex;

これは機能しました(エラーは発生しませんでした)。コメントで「スクリプトをmccでコンパイルしている」とおっしゃっています。test.m関数をMCCでコンパイルしているということですか?正しく思い出せば、R12.1では、MCCでコンパイルされたMコードがCコード(MEXまたはスタンドアロン実行可能ファイルのいずれか)に変換されたため、mexGetArrayPtrがアクセスするための「ワークスペース」がありませんでした。基本的に、これはMCCコンパイラの制限でした。私は試した

mcc -x test.m

(MCCで生成されたMEXファイルを作成します)あなたが説明した「caller」ケースと「global」ケースの両方で、「caller」を使用すると「oopsie」エラーが発生し、「global」を使用するとエラーが発生しません。説明された。

于 2011-02-04T21:39:04.887 に答える