我想写一个执行普通矩阵运算的函数。这可以通过二维数组或指针算法来完成。我更喜欢指针版本。现在,我想用指针来写一个函数,如下所示:
void matmult(double *a, double *b, double *c, int m, int n, int k);
问题是当我把二维数组传递给函数时,我必须使用一个强制转换。有没有一个好的解决方案来避免这个问题?
工作时不需要强制转换(当然),但我希望避免编译器警告。
更新:数组被定义为二维数组,调用函数如下所示:
// M, N, K are constants
double a[M][N];
double b[N][K];
double c[M][K];
matmult((double *)a, (double *)b, (double *)c, M, N, K);
函数matmult是矩阵乘法的直接实现(使用指针的三个嵌套for循环)
*(c + i*k + j) += *(a + i*n + p) * *(b + p*k + j);
我只想摆脱掉演员阵容。
2条答案
按热度按时间hi3rlvi21#
这个原型用于传递二维数组。参见C FAQ entry或Array to pointer decay and passing multidimensional arrays to functions。
c[M][K]
中的M
在C中完全是多余的,但作为自文档可能很有用(或者可能会让读者更加困惑)。然而,这并不是很好的封装,我会犹豫用它来编写一个通用的矩阵算法。大小是矩阵本身不可分割的一部分。我可能会使用C99的 * 灵活数组成员 * 来存储大小和数据,只要它不是其他结构的一部分。
oxf4rvwz2#
这就是我如何最终解决我的问题,感谢@尼尔的暗示:
现在,可以在不强制转换的情况下调用该函数,并且我避免了C99 VLA特性的限制(必须首先传递维度)。