2014-11-05 110 views
0

我有一个程序在C中顺序乘以矩阵,我试图完成。我收到标题中列出的错误。无效的操作数为二进制*(有'双*'和'双*')

这里是给我麻烦的行:

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

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

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

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

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

+2

[不投的malloc(朋友)的结果(http://stackoverflow.com/q/605845)。 – Deduplicator 2014-11-05 18:47:06

+3

数组索引不需要逗号。 – wildplasser 2014-11-05 18:48:50

+0

@Deduplicator当我进行搜索时,这并没有出现。谢谢你指出我。 – redeagle47 2014-11-05 18:49:10

回答

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); 
+0

我想我一定是从我正在看的算法中复制过来的。感谢您的帮助。 – redeagle47 2014-11-05 18:53:16

+0

是的,那些伪码算法通常使用更多的数学符号。另外,如果你真的阅读过这样的东西,那么你的阅读能力就会大大提高。 – Deduplicator 2014-11-05 18:56:14

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]; 
相关问题