我正在用 C 编写一个 n x n 矩阵乘法程序,其中 a[][] 和 b[][] 是输入,x[][] 是输出。 a、b 和 x 已分配,但我不确定如何正确地将指针传递给乘法函数。下面是我想做的事情的概述
void multiplication(float a, float b, float x, int n);
void main() {
float **a, **b, **x;
int n; // size of arrays (n x n)
multiplication(a, b, x, n);
}
void multiplication(float a, float b, float x, int n) {
// function
}
你要void multiplication(float *a, float *b, float *x, int n);
。请注意,通常您应该使用size_t
对于索引和数组大小,以及double
作为您首选的浮点类型,除非您有特定的原因使用float
.
Each of a
, b
and x
指向连续的浮点值,您将需要使用以下方式取消引用它们a[n * x + y]
.
除此之外,C99 还引入了各种有趣的优化可能性,在我所知道的任何编译器中,您几乎都不能依赖所有这些可能性:
- GCC 中的可变长度数组 http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
- XL C/C++ V7.0 中的数组(适用于 AIX) http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc03ary.htm
有了这些,这样的事情应该是可能的:
void multiplication(size_t len; // <- semicolon not a mistake
double a[len][restrict const len],
double b[len][restrict const len],
double c[len][restrict const len]);
这种迂腐的构造将向编译器表明数组的长度是相同的,它们是二维的,并且大小由运行时的调用代码指示。此外,所有数组都是可缓存的,因为它们不可以alias http://developers.sun.com/solaris/articles/cc_restrict.html另一个。
人们只能梦想 C 继续先进,C99 仍然没有得到完全支持,而且许多其他改进 http://plan9.bell-labs.com/sys/doc/comp.pdf还没有成为主流。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)