1

私はMatlabプログラマーであり、Cを何年も使用していません。ここで、Cでコードを記述し、MatlabからmexFunctionコマンドを介して呼び出す必要があります。ここまでは順調ですね。しかし、私のコードでは、引数と戻り値の両方が配列である多くの関数呼び出しが必要です。このために私はポインタリターンを使用しています。しかし、私は約100万の問題に遭遇しました。ある問題が修正されると、別の問題が発生します。

ソートコードの例は次のとおりです(実際のコードは大規模です)

#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 *’

最初にvdummyの代わりにSim[i]を渡そうとしましたが、それは機能しませんでした。そのため、最初にダミー変数を定義しました。

これは些細な問題だと思いますが、それでも人々の助けをいただければ幸いです。

4

1 に答える 1

3

のプロトタイプでclfunctionは、最初の引数としてスカラー double を渡す必要があります。pointer-to-double を渡しているqため、コンパイラ エラーが発生します。prhs[0]スカラーを含むことを期待していますか? もしそうならq[0]、値を抽出するために使用できます。またはmxGetScalar(prhs[0])、スカラー倍精度を返すものを使用できます ( http://www.mathworks.com/help/techdoc/apiref/mxgetscalar.html )。

ただし、それを修正しても mex ファイルが期待どおりに機能するかどうかはわかりません。ここで mex の例を読むのに時間がかかることをお勧めします: http://www.mathworks.com/support/tech-notes/1600/1605.html

特に、左辺に割り当てていないため、現在の mex ファイルは出力引数を生成しませんplhs

于 2011-07-11T08:45:29.097 に答える