我有一个程序,在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是一个整数值,用于定义列和行的大小。
我不知道为什么我会收到这个错误。从我看过的其他一些问题来看,当操作的类型不正确时会出现此错误,但我不明白为什么会出现这种情况。有没有人有任何想法?
答案 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];