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 函数中的“调用者”字符串更改为“全局”时,它工作正常。

我究竟做错了什么?

笔记:

  • 这是一个非常古老的 matlab 版本:版本 6.1.0.450 版本 12.1
  • mexGetArrayPtr 是 mexGetVariablePtr 的旧版本,是的,它的参数顺序不同
4

1 回答 1

1

我在 Solaris 上的 6.1.0.450 版本下尝试了这个示例。我必须改变的一件事是

test_mex();

是旧版本 MATLAB 中的语法错误,我需要将其更改为

test_mex;

这有效(没有产生错误)。您在评论中提到您正在“使用 mcc 编译脚本”。你的意思是你正在用 MCC 编译 test.m 函数?如果我没记错的话,在 R12.1 中,MCC 编译的 M 代码被转换为 C 代码(用于 MEX 或独立可执行文件),因此没有可供 mexGetArrayPtr 访问的“工作区”。本质上,这是 MCC 编译器的限制。我试过了

mcc -x test.m

(它构建一个 MCC 生成的 MEX 文件)与您描述的“调用者”案例和“全局”案例,并在使用“调用者”时看到“oopsie”错误,在使用“全局”时没有错误,就像你一样描述。

于 2011-02-04T21:39:04.887 回答