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

时间:2014-11-05 18:44:09

标签: c arrays

我有一个程序,在C中按顺序将矩阵相乘,我正在尝试完成。我收到了标题中列出的错误。

以下是给我带来麻烦的一句话:

C[i,j] = C[i,j] + A[i,k] * B[k,j];

A,B和C是二维阵列。它们使用以下代码定义:

A = (double **) malloc(sizeof(double *)*n);
for (r = 0; r < n; r++) {
  A[r] = (double *) malloc(sizeof(double)*n);
}

B和C的定义与此相同。 n是一个整数值,用于定义列和行的大小。

我不知道为什么我会收到这个错误。从我看过的其他一些问题来看,当操作的类型不正确时会出现此错误,但我不明白为什么会出现这种情况。有没有人有任何想法?

2 个答案:

答案 0 :(得分:3)

C中没有多索引索引运算符。

您所拥有的实际上是使用包含逗号运算符的表达式进行单索引。

逗号运算符始终返回其第二个参数。

所以,使用普通索引两次而不是试图以某种方式填充第二个索引。

C[i,j] = C[i,j] + A[i,k] * B[k,j];

相当于:

C[j] = C[j] + A[k] * B[j];

不是你想要的:

C[i][j] = C[i][j] + A[i][k] * B[k][j];

另外,Don't cast the result of malloc (and friends)

A = (double **) malloc(sizeof(double *)*n);

应该更不容易出错:

A = malloc(n * sizeof *A);

答案 1 :(得分:2)

C[i,j]相当于C[j]。此上下文中的i,j被视为逗号运算符,其值是最后一个表达式。

而不是

C[i,j] = C[i,j] + A[i,k] * B[k,j];

使用

C[i][j] += A[i][k] * B[k][j];