mexGetArrayPtr не работает должным образом - PullRequest
2 голосов
/ 02 февраля 2011

У меня есть следующая mex-функция test_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 Release 12.1
  • mexGetArrayPtr - это старая версия mexGetVariablePtr и да ее аргументпорядок отличается

1 Ответ

1 голос
/ 05 февраля 2011

Я пробовал этот пример под версией 6.1.0.450 на Solaris. Единственное, что мне пришлось изменить, это то, что

test_mex();

- это синтаксическая ошибка в старых версиях MATLAB, и мне нужно было изменить ее на

test_mex;

Это сработало (ошибок не было). Вы упоминаете, что вы «компилируете скрипт с помощью mcc» в своих комментариях. Вы имеете в виду, что вы компилируете функцию test.m с помощью MCC? Если я правильно помню, в R12.1 M-код, скомпилированный MCC, был превращен в C-код (для MEX или автономного исполняемого файла) и поэтому не имел «рабочего пространства» для доступа mexGetArrayPtr. По сути это было ограничением компилятора MCC. Я пытался

mcc -x test.m

(который создает MEX-файл, сгенерированный MCC) с описанным вами случаем «вызывающего» и «глобального», который вы видели и видели ошибку «oopsie» при использовании «caller» и отсутствие ошибки при использовании «global», как вы и описали.

...