当我创建一个像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[]){...}
帮助,如何正确编写?
答案 0 :(得分:1)
编译器已经告诉过你了 错误:声明'value'作为多维数组必须具有除第一个|
之外的所有维度的边界你需要指定长度,例如:double s [3],double [3] [3]等。
答案 1 :(得分:1)
来自编译器的错误消息非常有说服力。参数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.
答案 2 :(得分:0)
上面的人已经给出了技术解释。
背后的原因是C和C ++将数组视为内存块。当一个数组传递给一个函数时,所有发送的都是一个指向该数组的指针。这与Ada,Pascal和Fortran形成鲜明对比,它将数组的描述符发送给函数。
您的声明必须提供足够的信息,只需传递指针即可使用数组。这意味着需要除最后一个(第一个指定的)数组维度以外的所有维度。
可变大小的多维数组通常是糟糕设计的标志。如果你有一个固定的数组大小(在3D变换中常见4x4),那么2D数组效果很好。对于像通用矩阵操作这样的东西,2D数组不能很好地工作。
为此您需要定义一个类: 1)管理一维阵列 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] ; }
} ;