【问题标题】:error: invalid operands to binary * (have 'double' and 'double *')错误:二进制 * 的操作数无效(有 'double' 和 'double *')
【发布时间】:2018-10-25 18:18:49
【问题描述】:

我在这段代码中有一个错误:

mat mat_y(mat b, mat l, int n) {
    mat c = c = mat_new(n);
    for(i=0; i<n; i++)
    {
        c[i]=b[i];
        for(j=0; j<i; j++)
        {
            c[i] -= l[i][j] * c[j];
        }
    }
    return c;
}

错误:

二进制 * 的无效操作数(有 'double' 和 'double *')

这里有一些信息:

typedef double **mat;
int i,j,k;
void mat_zero(mat x, int n) {
    for (i = 0; i < n; i++) 
        for (j = 0; j < n; j++)
            x[i][j] = 0;
}


mat mat_new(int n) {
    mat x = malloc(sizeof(double*) * n);
    x[0] = malloc(sizeof(double) * n * n);

    for (i = 0; i < n; i++)
        x[i] = x[0] + n * i;
    mat_zero(x, n);

    return x;
}

【问题讨论】:

  • 您的类型没有排队。你试图混淆一个指向双精度和双精度的指针。它在抱怨哪一行?
  • c[j] 是指向双精度的指针。消息有什么不清楚的地方吗?
  • mat_new 搞砸了。您错误地分配了一个二维数组;它是一个数组数组和一个使用数学来确定列的一维数组的邪恶组合。
  • typedef 中隐藏指针不是一个好主意。这会导致混乱。
  • 并在for 循环中使用大括号

标签: c


【解决方案1】:

二元运算符* 不能将指针和双精度值相乘。从您的代码中可以看出,尽管您实际上并没有尝试乘以指针,而是错误地访问了双指针。

c[i] -= l[i][j] * c[j];

所以对于像double** 这样的指针,它意味着指向指针的指针。如果你只访问它一次,比如c[i],这会取消引用外部指针,从而导致指向双精度的指针。您需要取消引用 double** 两次才能访问其中的浮点数。

【讨论】:

    猜你喜欢
    • 2012-09-24
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多