我正在尝试在C中乘矩阵。乘法函数也称为点积函数。以下是函数和我得到的3个错误:
char dotProduct(void *A, void *B, int N, int i, int j) {
char result;
while(i < N - 1) {
while(j < N - 1) {
result += A[N * i + j] * B[N * i + j]; // error: invalid operands to binary expression ('void' and 'void')
j++;
}
i++;
}
return result;
}
void multiply(void *A, void *B, void *C, int N) {
for(int i = 0; i < N - 1; i++) {
for(int j = 0; j < N - 1; j++) {
C[N * i + j] = 0; // error: incomplete type 'void' is not assignable
for(int k = 0; k < N - 1; k++) {
C[N * i + j] += dotProduct(A, B, N, i, j); // error: subscripted value is not an array , pointer or vector
}
}
}
}
我不确定这些错误是什么意思。例如,“下标的值不是数组,指针或向量”:它是一个数组,我不知道为什么不能执行该操作。另外,其他2,我不明白他们的意思。有人可以详细说明吗?
答案 0 :(得分:0)
如果您要使用void
,则还需要传递数组的步幅,否则元素的间距是未知的。如果您使用的是8位,16位或32位浮点数(或整数),则需要表达这一点,否则编译器不知道元素之间的间隔是多少,也不知道指针应在内存中增加多少。即使您大步前进,编译器也不知道将两个void
相乘时的含义。
如果我使用C语言进行此操作,则可能会写出键入的版本,或者像这样模拟C ++模板:
#define DEFN_DOT_PRODUCT(TYPE, suffix) TYPE dotProduct##suffix(TYPE *A, TYPE *B, int N, int i, int j) { \
TYPE result = 0; \
while(i < N - 1) { \
while(j < N - 1) { \
result += A[N * i + j] * B[N * i + j]; \
j++; \
} \
i++; \
} \
return result; \
}
DEFN_DOT_PRODUCT(int, i);
DEFN_DOT_PRODUCT(float, f);
DEFN_DOT_PRODUCT(double, d);
#undef DEFN_DOT_PRODUCT
/* use */
dotProducti(/* whatever */)