Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        5年前关闭。
                                                                                            
                
        
我无法从以下C函数生成MEX文件:

#include <math.h>
#include <mex.h>

void mexFunction(int nlhs, mxArray *plhs[], /* Output variables */
                 int nrhs, const mxArray *prhs[]) /* Input variables */
{
    #define y plhs[0]
    #define x prhs[0]

    double y, x, p;
    int Y, X;

    mexPrintf ("x = %d",x);
    if(nrhs < 1 or nrhs > 2) /* Check the number of arguments */
        mexErrMsgTxt("Wrong number of input arguments.");
    else if(nlhs > 1)
        mexErrMsgTxt("Too many output arguments.");

    if(nrhs == 1) /* If p is unspecified, set it to a default value */
        c = 3.0;

    y=c*x*x;

    X=mxIsDouble(x);
    Y=mxIsDouble(y);

    mexPrintf ("the value for y is %d",Y);
}


我做了很多研究,但似乎仍然无法理解。我的任务只是生成一个MEX文件,当在matlab中输入x时可以生成y = 3x ^ 2。
我将文件另存为quadratic.c。当我打字

`mex quadratic.c`


在matlab命令中,我得到:

二次方
quadratic.c(15):错误C2143:语法错误:缺少';'在“类型”之前
quadratic.c(15):错误C2143:语法错误:缺少';'在“,”之前
quadratic.c(15):错误C2143:语法错误:缺少';'在“,”之前
quadratic.c(16):错误C2143:语法错误:缺少';'在“类型”之前
quadratic.c(18):错误C2143:语法错误:';'之前缺少')'
quadratic.c(18):错误C2059:语法错误:')'
quadratic.c(19):错误C2146:语法错误:标识符“ or”之前缺少“)”
quadratic.c(19):错误C2065:'or':未声明的标识符
quadratic.c(19):错误C2146:语法错误:缺少“;”在标识符“ nrhs”之前
quadratic.c(19):错误C2059:语法错误:')'
quadratic.c(19):错误C2143:语法错误:缺少“;”在“ {”之前
quadratic.c(19):警告C4552:'>':运算符无效;具有副作用的预期算子
quadratic.c(21):错误C2181:非法,否则不匹配
quadratic.c(25):错误C2065:“ c”:未声明的标识符
quadratic.c(25):警告C4244:'=':从'double'转换为'int',可能丢失数据
quadratic.c(27):错误C2143:语法错误:缺少';'在“ =”之前
quadratic.c(29):错误C2065:“ X”:未声明的标识符
quadratic.c(29):错误C2143:语法错误:';'之前缺少')'
quadratic.c(29):错误C2059:语法错误:')'
quadratic.c(30):错误C2065:'Y':未声明的标识符
quadratic.c(30):错误C2143:语法错误:';'之前缺少')'
quadratic.c(30):错误C2059:语法错误:')'
quadratic.c(33):错误C2065:“ Y”:未声明的标识符

  C:\ PROGRA〜1 \ MATLAB \ R2013A \ BIN \ MEX.PL:错误:'quadratic.c'的编译失败。


我不知道该怎么办。我确定我做错了什么,但我无法弄清楚。

最佳答案

11,12行中,您已将x,y定义为函数的输出和输入

11:   #define y plhs[0]
12:   #define x prhs[0]


但在15,16行中,您已将x,y定义为double类型的变量

15:   double y, x, p;
16:   int Y, X;


您应该更改11,12行或15,16行中变量的名称以使其与众不同,因为在编写11: #define y plhs[0]时,程序中的每个y实际上都由plhs[0]替换为编译器,这是Matlab中输出数据的指针。

因此,如果在访问第18行的值之前,先用double x代替double xVal,则应首先从prhs[0]获取其值

18:   mexPrintf ("x = %d",x);


因此,您应该在第18行之前编写以下代码:

xVal = mxGetPr(x)[0]; %assuming the input is real valued, and it is only a number.


另外,在访问y的值之前,应首先获取其值;

double yVal;
yVal = mxGetPr(y)[0];


重要的是prhs[0]plhs[0]是指向实际数据(值,大小,类型等)的指针,它们不是可以直接使用的值。

此外,在第19行:

19:   if(nrhs < 1 or nrhs > 2)


我不确定C中的or运算符是否为or,您可以编写

19:   if(nrhs < 1 || nrhs > 2) #replaced "or" with two lines


在第25行:

25: c = 3.0;


但是C与Matlab不同,您应该在使用变量c之前定义它。

我对XY的功能有些困惑,因为它们显然是x,y变量类型的指示符,而不是要打印的值。如果您如上所述编写double yVal = mxGetPr(y)[0];,则33行可以更改为:

30:   Y=mxIsDouble(y);
33:   mexPrintf ("the value for y is %d",yVal);

10-04 21:54