X,Y在C函数中传递数组的大小
我已经声明了我想要找到对角线[0] [0] …… [5] [5]和[0] [5] …… [5] [0]的最小值的函数。 我有算法但我的问题是实际的函数头。
我在为函数创建正式参数时遇到问题。 我知道我们必须将至少x[][this]
大小的数组传递给函数,但我尝试了各种组合,甚至
double minimum(int size, double x[][size]){...} double minimum(double x[][int size]){...}
第一种情况在调用时出错:
minimum(10, x[][10]) error: expected expression before ']' token `
第二种情况在函数声明中给出错误:
error: expected expression before 'int'
有人可以告诉问题是什么(或问题是什么)?
double minimum(int rowsize,int size, double x[rowsize][size]){...}
或简单
double minimum(int rowsize,int size, double x[][size]){...}
因此指定rowsize
是可选的。
但在这里我猜它是方形size x size
所以它会
double minimum(int size, double x[][size]){...}
所以你是对的。
怎么称呼它?
minimum(10,x)
如果您正在处理固定大小为5的数组,那么您可以声明函数
double minimum( double x[][5] );
并称之为
minimum( x );
如果可以更改数组的大小,则可以使用可变长度数组并声明函数
double minimum( size_t n, double x[][n] );
用于自我记录的
double minimum( size_t n, double x[n][n] );
该函数可以被称为
minimum( 10, x );
或者喜欢
minimum( sizeof( x ) / sizeof( *x ), x );
您可以使用先前的forms参数作为C99函数的后续forms参数的维度,请参阅此问题。
所以以下代码是有效的:
double sum (int w, int l, double mat[w][l]) { double s = 0.0; for (int i = 0; i < w; i++) for (int j = 0; j < l; j++) s += mat[i][j]; return s; }
如果你已经申报了
double t[5][7];
你可以打电话
double s = sum(5,7,t);
但是,您可能不希望这样。 一种可能性是将矩阵( 抽象数据类型 )表示为指向以灵活数组成员结尾的struct
的指针:
struct matrix_st { unsigned w; unsigned h; double m[]; // conventionally w*h double numbers };
你可以分配它
struct matrix_st *make_matrix (unsigned w, unsigned h) { // we might check that w and h are of reasonable size.... struct matrix_st* pm = malloc(sizeof(struct matrix_st)+w*h*sizeof(double)); if (!pm) return NULL; // malloc failure pm->w = w; pm->h = h; for (long i=w*h-1; i>=0; i--) pm->m[i] = 0.0; return pm; };
例如
struct matrix_st* mat = make_matrix(5,7);
当你完成后,只需free(mat);
电话free(mat);
(最好是mat = NULL;
)。
您可以将访问它的函数编码为:
inline double matrix_access(struct matrix_st*pm, unsigned i, unsigned j) { assert (pm != NULL); assert (i < pm->w); assert (j < pm->h); return pm->m[i*pm->w+j]; }
(实际上,由于该function是inline
,它可以非常快速地运行,几乎与其他解决方案或问题的答案一样快)
我向读者留下编码其他矩阵函数的练习(包括修改矩阵的元素,相当于sum
等等)。