сообщения об ошибках при записи файлов Mex, проблема с выводом массива из функций? - PullRequest
1 голос
/ 11 июля 2011

Я больше программист Matlab, и я не использовал C годами! Теперь я должен написать некоторый код на C и вызвать его из Matlab с помощью команды mexFunction. Все идет нормально. Но мой код требует много вызовов функций, где и аргумент, и возвращаемые значения являются массивами. Для этого я использую указатель возвращает. Но я столкнулся с примерно миллионом трудностей, когда одна исправлена, другая создается.

пример кода сортировки выглядит следующим образом (фактический код массивный)

#include "mex.h"
#include "math.h"

int Slength=95;


double innercfunction(double q,double y)
{
  int i;
  double X;

  X=q*y;

}

double *c1function(double q,double Sim[])
{
  double *F12=malloc(Slength);
  int i;
  double vdummy,qdummy;
  qdummy=q;

  for(i=0;i<Slength;i++)
  {
    vdummy=Sim[i];
    F12[i]=innercfunction(qdummy,vdummy);
  }
  return F12;
}


void mexFunction(int nlhs, mxArray *prhs[],int nrhs,const mxArray *plhs[])
{
  double *q=mxGetPr(prhs[0]);
  double *Sim=mxGetPr(prhs[1]);

  double *SS=c1function(q,Sim);
}

Я сохраняю его как help_file.c и компилирую из рабочей области MATLAB как:

mex -g help_file.c

, к которому я получаю следующую ошибку:

help_file.c: In function ‘mexFunction’:
help_file.c:38: error: incompatible type for argument 1 of ‘c1function’
help_file.c:17: note: expected ‘double’ but argument is of type ‘double *’

Сначала я попытался передать Sim [i] вместо vdummy, но это не сработало, поэтому я определил переменную-пустышку.

Я полагаю, что это тривиальная проблема, но я все равно был бы признателен за помощь людей.

1 Ответ

3 голосов
/ 11 июля 2011

Прототип clfunction требует, чтобы вы передали скалярное двойное число в качестве первого аргумента;вы передаете указатель на double q, отсюда ошибка компилятора.Вы ожидаете, что prhs[0] будет содержать скаляр?Если это так, вы можете использовать q[0] для извлечения значения;или же вы можете использовать mxGetScalar(prhs[0]), который возвращает скалярное удвоение (http://www.mathworks.com/help/techdoc/apiref/mxgetscalar.html).

Однако я не уверен, что это исправление сделает ваш мекс-файл работающим так, как ожидается.Я бы посоветовал потратить некоторое время, чтобы прочитать примеры mex здесь: http://www.mathworks.com/support/tech-notes/1600/1605.html

В частности, ваш текущий файл mex не будет выдавать никаких выходных аргументов, так как вы не присваиваете левой сторонеplhs.

...