【问题标题】:Compiling MEX file from C [closed]从 C 编译 MEX 文件 [关闭]
【发布时间】:2014-05-04 04:14:39
【问题描述】:

我在从以下 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 命令中,我得到:

二次方.c 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:语法错误:在标识符“或”之前缺少“)” quadratic.c(19):错误 C2065:“或”:未声明的标识符 quadratic.c(19):错误 C2146:语法错误:缺少“;”在标识符“nrhs”之前 quadratic.c(19):错误 C2059:语法错误:')' quadratic.c(19):错误 C2143:语法错误:缺少“;”前 '{' quadratic.c(19) : 警告 C4552: '>' : 运算符无效;具有副作用的预期运算符 quadratic.c(21) : 错误 C2181: 非法 else 不匹配 if 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”编译失败。

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

【问题讨论】:

  • 因为你在没有真正理解的情况下使用了邪恶的宏。当您声明double y, x 时,它会被预处理器替换为double plhs[0], prhs[0]。这与论点冲突

标签: c matlab mex


【解决方案1】:

在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 实际上都替换为@987654332 @由编译器,这是指向Matlab中输出数据的指针。

因此,如果您已将 double x 替换为 double xVal,则在访问第 18 行的值之前,您应该首先从 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。

X 和Y 的功能让我有些困惑,因为它们显然是x,y 变量类型的指示符,而不是要打印的值。如果你像上面写了double yVal = mxGetPr(y)[0];,那么33这一行可以改成这样:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多