当我创建一个多维数组,如value[][],并将其传递给函数。但是我很困惑如何为这个函数写一个原型,因为有一个错误信息,如:
error: declaration of 'value' as multidimensional array must have bounds for all dimensions except the first|
//function prototype;
void matrix(double s[],int j,int n,double value[][],double alpha[], double beta[], double gamma[]);
//function
void matrix(double s[],int j,int n,double value[][],double alpha[], double beta[],double gamma[]){...}
help,如何正确书写?
来自编译器的错误消息非常有说服力。参数double value[][]
需要更改为double vale[][N]
,其中N为整数。例子:
double value[][20] // A matrix in which each row has 20 columns.
double value[][10] // A matrix in which each row has 10 columns.
编译器已经告诉你了错误:将'value'声明为多维数组必须对除第一个维度之外的所有维度都有边界|
需要指定长度,例如:double s[3], double[3][3]等
上面的人已经给出了技术解释。
背后的原因是C和c++将数组视为内存块。当一个数组被传递给一个函数时,得到的只是一个指向该数组的指针。这与Ada、Pascal和Fortran将数组的描述符发送给函数形成鲜明对比。
声明必须提供足够的信息来处理仅传递一个指针的数组。这意味着除了最后一个(第一个指定的)数组维度之外,它需要所有的数组维度。
可变大小的多维数组通常是糟糕设计的标志。如果你有一个固定的数组大小(4x4在3D变换中很常见),那么2D数组就可以很好地工作。对于一般用途的矩阵运算,2D数组不能很好地工作。你需要定义一个这样的类:1)管理一个1D阵列2)提供将2D引用转换为1D索引的机制。
你要做的是像
class Matrix
{
unsigned int range1 ;
unsigned int range2
double *values ; // Could use a template
double &valueAt (unsigned int x, unsigned int y) { return values [range1 * x + y] ; }
} ;