以下代码返回错误:Expression必须具有指向对象的指针 类型。不知何故,问题在于我引用参数A,B和out的方式,每个参数指向2D数组。任何帮助将不胜感激。
目标是将两个数组相乘。
#include <stdio.h>
void matrixmul(const float *A, const float *B, int m, int n, int k, float *out)
{
float value = 0.0;
int x, y, z;
for (x = 0; x < k; x++) {
for (y = 0; y < m; y++) {
for (z = 0; z < n; z++) {
float product = A[y][z] * B[z][y];
value = value + product;
printf("%lf", value);
}
out[y][x] = value;
value = 0;
}
}
}
int main(void) {
float a[2][3] = {
{ 1.0,2.0,1.0 },
{ 3.0,4.0,1.0 }
};
float b[3][1] = {1, 2, 3};
float array[2][1];
matrixmul((float *) a, (float *) b, 2, 3, 1, (float *) array);
return 0;
}
答案 0 :(得分:1)
由于A
在函数中声明为const float *A
,因此A[y][z]
是无效的术语。 A[y]
评估为键入const float
。您不能使用数组运算符[z]
和浮点数。
B
和out
也出现同样的问题。
您可以将功能定义为
void matrixmul(const float A[][3], const float B[][1], int m, int n, int k, float out[][1])
{
...
}
并将该函数简单地称为:
matrixmul(a, b, 2, 3, 1, array);
C99 / C11支持可变长度数组。假设您可以使用支持C99 / C11的编译器,则可以将该函数定义为
void matrixmul(int arows, int acols, int bcols,
const float A[arows][acols],
const float B[acols][bcols],
float out[arows][bcols])
{
...
}
并使用
调用该函数matrixmul(2, 3, 1, a, b, array);
答案 1 :(得分:0)
该函数不知道数组的维数,因此它不知道如何计算给定行和列的值的地址。但是,您可以使用函数的参数来定义矩阵的尺寸。您必须重新排列函数中的参数,以便指定维度的参数出现在数组之前。使用您的函数,它可能看起来像这样:
void matrixmul(int m, int n, int k, const float A[m][n], const float B[n][m], float out[m][k])
顺便说一下,我还没有完全阅读过该函数,但out[y][k] = value;
应该是out[y][x] = value;
吗?