C函数丢失的一个论点

时间:2017-09-07 22:01:29

标签: c arguments mex

我有一个函数,我从一个只带两个参数的库中获取,一个整数和一个指向某个矩阵的指针:

double *r8mat_expm1 ( int n, double *a );

我声明要使用的变量,并为其分配一些内存:

double *matrix;
matrix = (double*)mxCalloc(1000,sizeof(double));

然后,我检查了print语句,以确保在调用它之前填充它,例如:

mexPrintf("First element of matrix is: %f\n", matrix[0]);
ans = r8mat_expm1(n, matrix);

进入函数后,我要做的第一件事是检查参数是否正确传递:

double *r8mat_expm1 ( int n, double *a )
{ 
  mexPrintf("n is %d. First element of a is: %lf\n",n, a[0]);
 ...

我从这份印刷声明中了解到n已正确通过,但a没有!鉴于从检查matrix的内容到将其传递给函数之前没有执行任何其他代码行,我无法看到这是怎么回事。为了完整起见,我还尝试将matrix声明并传递为数组(即double a []),但这不起作用,或者...

这个库函数有什么东西可以使我在所有自制函数中使用的语法不能以相同的方式工作吗?

更新:当我将函数r8mat_expm1()从一个单独的源文件移动到与“main”相同的源文件(实际上是一个mexFunction)时,传递的参数确实毫无障碍 - 继续我的好消息工作,但现在我更加困惑。这是否意味着链接存在问题?如果是这样,在这种情况下怎么会传递整数参数,但是指向double参数的指针失败了?

具体来说,当函数在单独的源代码中时(如最初发布时)会发生的情况是矩阵“a”将填充不是随机值,而是完全用零填充,这是非常可疑的。 (我在问题中添加了标签'mex',因为我现在怀疑这是一个Matlab / mex特定问题,并且在常规C环境中,一切都可能没问题。)

有没有人有任何想法?

1 个答案:

答案 0 :(得分:2)

我编译并运行您的代码如下。它并没有让我失望。

#include <stdlib.h>
#include <stdio.h>

double *r8mat_expm1(int n, double *a);

int main()
{
    double *matrix;
    matrix = (double*)calloc(1000,sizeof(double));
    *matrix = 5.67;
    printf("First element of matrix is: %f\n", matrix[0]);
    int n = 27;
    double *ans = r8mat_expm1(n, matrix);
    return 0;
}

double *r8mat_expm1(int n, double *a)
{
    printf("n is %d. First element of a is: %lf\n", n, a[0]);
    return a;
}

输出结果为:

First element of matrix is: 5.670000
n is 27. First element of a is: 5.670000

顺便说一句,@ JohnBollinger是对的:应该在两个地方使用相同的%f说明符。