【问题标题】:Strange error on c++ matlab codec++ matlab代码上的奇怪错误
【发布时间】:2014-04-09 18:48:13
【问题描述】:

这是我的代码的一部分:

double h;
double sigma;

/* The gateway function */
void mexFunction( int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray *prhs[])
{
   double *nor;
   int n    =  mxGetScalar(prhs[0]);
   h        =  mxGetScalar(prhs[1]);
   nor      =  mxGetPr(prhs[2]);
   sigma    =  mxGetScalar(prhs[3]);

   double *x;    

   /* create the output vector */
    plhs[0] = mxCreateDoubleMatrix(1,n,mxREAL);

    /* get a pointer to the real data in the output matrix*/
    x = mxGetPr(plhs[0]);    

    /* call the computational routine */
    createTRR(x,n,nor);
}

如果我尝试在 matlab 中使用 mex myfilename.c 编译它,我会收到以下错误:

  1. 错误 C2143:语法错误:缺少 ';'在“类型”之前(在这一行中:double *x;
  2. error C2065: 'x' : undeclared identifier (in this line x = mxGetPr(plhs[0]);) 和
  3. error C2065: 'x' : undeclared identifier (in this line createTRR(x,n,nor);)

我看不出有什么问题,我也不明白为什么没有为 *nor 抛出错误而只为 *x 抛出错误。我在 ubuntu 上用 Matlab2012 编写了代码,它工作正常。现在,我目前在 Win7 上使用 Matlab 2013b 和 Microsoft 软件开发工具包 (SDK) 7.1 作为 C++ 编译器。

【问题讨论】:

  • hnorsigma 声明在哪里?
  • @JohnnyMopp h 和 sigma 被声明为全局,请参阅编辑后的代码。也没有在 mexFunction 的第一行定义。

标签: c++ c matlab


【解决方案1】:

您的代码是 C++ 而不是严格意义上的 c:您在函数代码的开头 声明变量 x。您可能还记得在 C 语言中,您必须在函数代码之前声明所有局部变量。

将您的文件扩展名转换为 cpp 并重新混合它。

【讨论】:

  • 自 C99 以来,C 的声明与语句混合在一起。可能他只是缺少正确的编译器标志。
  • @JensGustedt 没错,但mex 默认使用 ANSI (C89/C90),它不支持它。我假设您已经看到了,但命令行修复在我的答案中。
【解决方案2】:

编译为 ANSI C 代码时,不能在代码之后声明变量。您可以按照 Shai 的建议重命名为 .cpp,或者您可以保留文件名并启用C99 standard,它允许在代码中声明:

mex -v -largeArrayDims CFLAGS="\$CFLAGS -std=C99" file.c 

这也允许在文件中使用 C++ 样式的 cmets(即// C++-style comment)。

另见Why was mixing declarations and code forbidden up until C99?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多