我更像是一名Matlab程序员,多年来没有使用过C语言!现在我必须在C中编写一些代码,并通过mexFunction命令从Matlab调用它。到现在为止还挺好。但是我的代码需要很多函数调用,其中参数和返回值都是数组。为此,我使用指针返回。但是我遇到了大约一百万个困难,一旦修复另一个就会产生困难。
排序代码示例如下(实际代码很大)
#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,这不起作用,这就是我首先定义虚拟变量的原因。
我想这是一个微不足道的问题,但我仍然会感谢大家对此的帮助。
答案 0 :(得分:3)
clfunction
的原型要求你传递标量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
。