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等等)。